虚拟地址空间,虚拟文件系统

Linux内核:虚拟地址空间布局 在上面给出的进程地址空间经典布局图中,共享库的装载地址为0x40000000,这实际上是Linux kernel 2.6版本之前的情况了,在2.6版本里,共享库的装载地址已经被挪到靠近栈的位置,即位于0xBFxxxxxx附近,因此,此时的堆范围就不会被共享库分割成2个“碎片”,故kernel 2.6的32位Linux系统中,malloc申请的最大内存理论值在2.9GB左右。泄漏的内存往往比忘记释放的数据结构更大,因为所分配的内存通常会圆整为下个大于申请数量的2的幂次(如申请212B,会圆整为256B)。 阅读详情

1、虚拟地址空间

1、概念与原因

        虚拟地址空间是一个抽象的概念,在IBM中,这样说道:它存在,但你看不见,就是虚拟的。虚拟地址空间就是这样一个东西。(注意区分虚拟内存与虚拟地址空间)

        虚拟地址空间,操作系统为了使每个进程都拥有独立的地址空间,使得每个进程都隔离开,便为每个进程都分配了独立的地址空间。它可以用来加载程序数据(数据可能被加载到物理内存上,空间不够就加载到虚拟内存中)

        虚拟内存,在磁盘中存在交换区,以解决虚拟内存大于物理内存的情况,通过换页机制,达到进程层面的内存扩容。

为什么要用虚拟地址空间:1、每个进程的地址不隔离,这样不安全,别的进程可以通过内存寻址来修改此进程的值,有危险;2、进程中的地址是不确定,每次都会发生变化,这样每次加载到物理地址,都需要使用相对地址,效率低。3、如果直接使用物理内存的话,在物理内存不够的情况下,需要更换的是整个进程,效率低。

2、虚拟地址空间的分区

老生常谈的问题,内核区与用户区。用户区又常分为:代码区、数据区(.data, .bss)、堆、栈等。具体画分如下:

 

3、虚拟地址空间与物理地址空间的关系

        我们在程序中使用的地址是虚拟地址,硬件CPU在执行的时候使用的是物理地址。那么进程中的数据是如何进出入到物理内存中的呢?其实是通过 CPU 中的内存管理单元 MMU(Memory Management Unit)从进程的虚拟地址空间中映射过去的。

        通常有三种映射方式:分段,分页,段页式。

1、分段

        程序是由若干个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段(Segmentation)的形式把这些段分离出来。

分段机制下的虚拟地址由两部分组成,段选择因子和段内偏移量。

 大概模型可以参考如下:

如果要访问段 3 中偏移量 500 的虚拟地址,我们可以计算出物理地址为,段 3 基地址 7000 + 偏移量 500 = 7500。

分段存在的问题: 内存碎片;内存交换效率低。

1、外部内存碎片:就是在段的加载与释放上,产生了不能用的小段物理内存,导致新的程序无法被加载。

2、内部内存碎片:程序某个段的所有都被加载到内存中,但是有部分并不使用,造成浪费。

针对内存碎片的问题,需要加载新的程序,此时就有虚拟内存使用,交换段(整个交换)

效率低的原因就是段太大,交换的时候耗时。

2、分页

 

1、由于内存空间都是预先划分好的,也就不会像分段会产生间隙非常小的内存,这正是分段会产生内存碎片的原因。而采用了分页,那么释放的内存都是以页为单位释放的,也就不会产生无法给进程使用的小内存。

2、如果内存空间不够,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页面给释放掉,也就是暂时写在硬盘上,称为换出(Swap Out)。一旦需要的时候,再加载进来,称为换入(Swap In)。所以,一次性写入磁盘的也只有少数的一个页或者几个页,不会花太多时间,内存交换的效率就相对比较高。

3、段页式

就是结合分段与分页,先分段,再分页。

 4、Linux如何管理

Linux 内存主要采用的是页式内存管理,但同时也不可避免地涉及了段机制。

这主要是上面 Intel 处理器发展历史导致的,因为 Intel X86 CPU 一律对程序中使用的地址先进行段式映射,然后才能进行页式映射。既然 CPU 的硬件结构是这样,Linux 内核也只好服从 Intel 的选择。

但是事实上,Linux 内核所采取的办法是使段式映射的过程实际上不起什么作用。也就是说,“上有政策,下有对策”,若惹不起就躲着走。

Linux 系统中的每个段都是从 0 地址开始的整个 4GB 虚拟空间(32 位环境下),也就是所有的段的起始地址都是一样的。这意味着,Linux 系统中的代码,包括操作系统本身的代码和应用程序代码,所面对的地址空间都是线性地址空间(虚拟地址),这种做法相当于屏蔽了处理器中的逻辑地址概念,段只被用于访问控制和内存保护。

2、虚拟文件系统

文件系统的种类众多,而操作系统希望对用户提供一个统一的接口,于是在用户层与文件系统层引入了中间层,这个中间层就称为虚拟文件系统。

VFS 定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解 VFS 提供的统一接口即可。

 VFS的作用就是采用标准的系统调用读写位于不同物理介质上的不同文件系统。VFS是一个可以让open()、read()、write()等系统调用不用关心底层的存储介质和文件系统类型就可以工作的粘合层。

29、内存管理内部原理 - 进程虚拟地址空间详解 本文深入解析了Linux系统中进程的虚拟地址空间(VAS)布局,包括用户空间与内核空间的划分与映射机制。详细介绍了通过proc文件系统及相关工具(如/proc/PID/maps、pmap、smem、procmap)查看和分析内存映射的方法,并探讨了物理内存的管理与调试应用,如内存泄漏与段错误的排查。内容对系统性能优化、内存问题调试及内核理解具有重要参考价值。 阅读详情

相关推荐

33、Linux 进程虚拟地址空间管理详解

本文详细解析了Linux系统中进程虚拟地址空间(VAS)的管理机制,涵盖内核与用户模式VAS的布局、使用proc文件系统和多种工具(如/proc/PID/maps、pmap、smem、procmap)查看内存映射的方法,以及空陷阱页的作用与意义。通过理论讲解与实例演示,帮助开发者和系统管理员深入理解Linux内存管理机制,从而优化系统性能与稳定性。

m2n3b4v5c6的博客 60

虚拟地址空间

虚拟地址空间是指操作系统为每个运行中的进程分配的抽象地址空间。这个地址空间使得每个进程都觉得它拥有一个独立的、连续的内存区域,而实际上这个内存区域可能分布在物理内存的不同位置,甚至可能被存储在磁盘上。在虚拟地址空间中,进程访问的是虚拟地址,而不是实际的物理地址。操作系统(MMU, 内存管理单元, Memory Management Unit)负责将虚拟地址映射到物理地址,这个过程称为地址转换。通过虚拟地址空间,操作系统可以为每个进程提供独立的、隔离的内存空间,从而增加了系统的稳定性和安全性。

f593256的博客 2045

FPGA人脸识别检测(先获取人脸图像以及灰度二值化)

由于图片有空洞等缺陷,所以后面要进行中值滤波、腐蚀、膨胀等算法处理,然后再对人脸进行框选,最后显示出来。最终的成像应该是下面这样的。(后面有时间再接着做哈哈哈)5、通过modelsim将操作后的图片数据写入gray_img.txt里面后,用matlab将txt转成图片。1、先用matlab将图片转换成txt数据,代码如下。读取图片的方式按照博客咸鱼里的方式来做,如下。2、FPGA读取txt数据。4、FPGA顶层模块及仿真。3、FPGA灰度二值化。

weixin_46312715的博客 2531

虚拟地址空间【详解】 虚拟地址空间是什么 | 为什么要有虚拟地址空间

虚拟地址空间来辣!各位看管走过路过不要错过啦

anyway33的博客 2942

使用pdfBox实现pdf转图片出现中文方块乱码 简单修改源码解决

参考文章 问题排查:使用pdfbox将pdf转image时STSong-Light字体中文乱码 pdfbox版本是2.0 日志中打印出类似这样的日志(例:Using fallback XXX for CID-keyed font STSong-Light),就说明系统没有安装STSong-Light字体,pdfbox使用XXX字体来替代了。如果出现方块,就说明没有这种字体,并且替代字体也没有,日志也有相应的其他提示。 正常操作就是安装缺失的 STSong-Light 字体,但是在网上搜到的都是 STSong

aji_csdn的博客 5266

STM32-DAC定时器触发三角波生成【频率与幅度精准控制】

本文详细介绍了STM32 DAC定时器触发三角波生成的原理与实现方法,涵盖硬件配置、频率与幅度精准控制技巧及代码实现。通过定时器触发DAC模块,可灵活调节三角波的频率和幅度,适用于信号发生器等高精度应用场景。

weixin_29161785的博客 452

【linux--->虚拟地址空间】

要了解地址空间,我们首先要打破在学习C语言时,对于地址的片面的见解,只是简单的认为我们看见的指针变量中存储的,或者是&变量名而得到的地址就是物理地址。其实不然,我们平时使用和看到的地址只是一个存在于虚拟地址空间的虚拟地址。下面一段C语言代码可以验证从这一段代码可以看出相同地址下存储的值是不一样的,如果这是物理地址的话,那么这是不符合常理的,所以我们在高级语言中使用的不是物理地址,而是虚拟地址。

kk1125778230的博客 1436

sec_uid

webcast_uid转sec_uid,webcast_uid转uid,webcast_uid转dy号

m0_56967679的博客 4420

初识虚拟地址空间

物理地址和虚拟地址 物理寻址:CPU访问存储器的最原始方法就是直接用物理地址(Physical Address, 可简称PA)。物理地址是唯一的。 虚拟寻址:CPU通过生成一个虚拟的地址来访问内存,在访问前会把虚拟地址转化为物理地址。虚拟地址(virtual Address, 可简称VA)。 MMU:它是memory manage unit的缩写,内存管理单元。内存管理单元是CPU芯片上的硬件,它的作用是利用存放在内存中的表将虚拟地址转变成物理地址,这个转变的步骤被称为地址翻译。

qq_56870066的博客 4217

基于STM32、HAL库的ZMOD4510AI4R气体传感器驱动程序设计

ZMOD4510AI4R是Renesas公司推出的一款数字空气质量传感器,主要用于检测臭氧(O₃)和总挥发性有机化合物(TVOC)浓度。(status & 0x80)) // 检查数据就绪位。// 等待测量完成 (实际应用中应该使用非阻塞方式)// 转换为ppb (简化转换,实际应根据传感器文档校准)* @param hzmod: ZMOD4510句柄。* @param tvoc: TVOC浓度(ppb)* @param ozone: 臭氧浓度(ppb)* @param hi2c: I2C句柄。

corlin6688的博客 311

【数据分析】R语言分段结构方程模型手把手教程(Piecewise Structural Equation Model)

分段结构方程模型(Piecewise Structural Equation Model, SEM)是一种用于分析变量之间因果关系的统计方法。它通过将复杂的因果关系分解为多个简单的线性模型来评估变量之间的直接和间接效应。与传统的结构方程模型(SEM)不同,分段结构方程模型不需要假设数据的多变量正态分布,因此在处理非正态数据时更为灵活。

专注生信领域 2647

LINUX文件系统和虚拟地址空间

目录 1.虚拟内存空间解决了什么问题? 2.LINUX虚拟内存空间结构 3.页表 1.虚拟内存空间解决了什么问题? 闲谈:在研究虚拟地址空间,看到了一篇博客,说:在看到一项技术时,如果直接去看他的概念、用法、而忽视了他对比以前的技术有什么提升,解决了了以前技术中的哪些问题,这样是很不负责的。 正题:在计算机技术发展的早期,通常程序是直接访问物理地址的,只要程序需要的内存大小不超过物理内...

第一视角 347

热力学仿真软件:Fluent_(13).燃烧与化学反应仿真

燃烧模型在热力学仿真软件中扮演着至关重要的角色。Fluent 提供了多种燃烧模型,包括层流预混燃烧模型、湍流预混燃烧模型、非预混燃烧模型、部分预混燃烧模型等。这些模型可以帮助用户模拟不同的燃烧过程,从而更好地理解燃烧现象和优化燃烧系统设计。

kkchenjj的博客 1252

Linux虚拟文件系统(VFS)

虚拟文件系统的目的:通过一个抽象层,存储设备使用不同的文件系统都可以通过相同的接口访问:open(),red(),write();

qq_35693377的博客 1323

万字详解YOLOv8网络结构Backbone/neck/head以及Conv、Bottleneck、C2f、SPPF、Detect等模块

YOLOv8是由Ultralytics开发的最先进的目标检测模型,推升了速度、准确性和用户友好性的界限。YOLO这一缩写代表“你只看一次”(You Only Look Once),通过在一次网络传递中同时预测所有边界框,提升了算法的效率和实时处理能力。相比之下,其他一些目标检测技术需要经过多个阶段或过程来完成检测。YOLOv8在流行的YOLOv5架构上进行了扩展,在多个方面提供了改进。

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 14万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

UC基础-002(虚拟地址)

权限模式,取值为:8进制的数,0abc(其中a代我,b代表同组人员,c代表用户,读取值为4;没有与物理地址建立映射关系的虚拟地址无法直接使用,所以可以通过mmap函数去手动建立虚拟地址和物理地址的映射关系。当创建一个变量等情况,所使用的地址(&)都是虚拟地址,内核会将此虚拟地址和真正的物理地址放入一个一对一。其中0~3G-1的范围归用户使用,3G~4G-1的范围归内核使用。不同性质的变量,操作系统给划分虚拟地址的时候会给划分到不同的区域。返回值:返回的是一个文件的描述符,且是当前未被使用的。

qq_54453045的博客 1000

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

操作系统那些事

现代操作系统的实现是一个高度抽象的、复杂的、伟大的工程。本文主要是简单介绍操作系统里面的最重要的三个抽象概念:进程,虚拟地址空间,文件,以及他们各自涉及到的相关要点。 进程进程是对cpu的抽象,cpu是执行一条条的指令,进程被抽象为程序的执行流。 跟进程相似的一个概念是线程,其中线程可以再分为2类,一类是用户级线程,也就是posix线程(c语言里面的pthread类函数);还有

一边敲代码,一边思考人生... 1053

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

为什么操作系统需要文件系统?

在了解文件系统前,我们应该知道关于关于操作系统的存在意义?首先从使用者的角度来说(当然也可以认为是自上而下的角度)操作系统是为用户或者程序员提供了一层抽象概念,我们只需要了解熟悉操作系统的抽象即可完美了控制和使用整个电脑,所以使用者是不用完全的关心GPU处理器丶储存器和各种其他硬件设施的细节。这样你将成为一个无情的接口调用者,当然你还可以在他提供的抽象之上再搞一个更合理的抽象,比如Java虚拟机的可移植性依赖于在不同的操作系统上有不同的JVM,这是一个有意思的想法,或者说有没有这样一种可能,我们的...

qq_41528918的博客 771

软件分层(数据结构/软件逻辑上分层+举例),相连节点的概念+如何相连,为什么是层状结构(软件分层,网络协议分层+梳理协议顺序),协议分层(打电话例子)

软件分层(数据结构/软件逻辑上分层+举例),相连节点的概念+如何相连,为什么是层状结构(软件分层,网络协议分层+梳理协议顺序),协议分层(打电话例子)

m0_74206992的博客 1255

操作系统知识点

1、进程的状态 阻塞:进程在等待某个外部信号,例如等待读取磁盘完成 运行:进程在执行程序 就绪:进程在排队等待执行 运行和就绪可以互达;运行可以到阻塞,阻塞不能直接到运行;阻塞可以到就绪,就绪不能到阻塞。 2、调度问题 当多个进程或线程竞争cpu导致2个及以上进程或线程处于就绪状态,需要等待操作系统的调度。调度需要完成以下问题: 新任务何时执行 任务临时终止如何选择下一个任务 任务阻塞如何选择下一个任务 发生中断时如何响应 调度的通用目标: 公平——每个进程公平的分享cpu份额,或者根据给定的优先

qq_40438165的博客 1697

第一周总结

精通windows api: 1.文件系统: 卷(volumes)磁盘和驱动器管理:  操作驱动器挂载点文件和目录管理:  获取程序所在的目录,程序模块路径,获取和设置当前目录                        查找文件,遍历指定目录下的文件和子目录                        递归遍历目录树                        获取,设置文件属性和时间内存映射文件:   使用Mapping File提高文件读写的效率                      通过M

ray'space 431

《深入Linux内核架构》笔记 --- 第一章 简介和概述

Linux将虚拟地址空间划分为两个部分,分别称为内核空间和用户空间 各个系统进程的用户空间是完全彼此分离的,而虚拟地址空间顶部的内核空间总是同样的,无论当前执行的是哪个进程。 尽管Intel处理器区分4中特权级别,当Linux只使用两种不同的状态:核心态和用户态。两种状态的关键差别在于对高于TASK_SIZE的内存区域的访问。 在中断上下文中运行不能访问虚拟地址空间中的用户空间...

pengdonglin137的专栏 85

Proc 文件系统信息

Proc 文件系统信息 2011年03月30日   Proc 文件系统信息   关键字:proc,maps,status,sysfs,smaps   说在前面的,下面的东西是我从网上收集整理的,另外还加了些别人没有的,新的内核支持输出更多的内容的到proc中。   不得不说的是,按照最近的内核驱动架构,很多驱动和硬件相关的信息都输出到sysfs去了,proc里的东西比较凌乱,...

lpl20lpl 184

linux内核的五大作用(转)

Linux内核的五大作用;分别是管理进程,内存,文件系统,设备控制,还有网络管理。 1、管理进程:内核负责创建和销毁进程, 并处理它们与外部世界的联系(输入和输出),不同进程间通讯(通过信号,管道,或者进程间通讯原语)对整个系统功能来说是基本的,也由内核处理。 另外, 调度器, 控制进程如何共享CPU,是进程管理的一部分。更通常地,内核的进程管理活动实现了多个进程在一个单个或者几个CPU 之上的抽象。 2、管理内存:计算机的内存是主要的资源, 处理它所用的策略对系统性能是至关重要的。内核为所有进程的每一个都

beyond911的专栏 2484

Linux的内核功能以及作用

Linux主要负责系统的进程管理、内存管理、文件系统、网络功能、硬件驱动、安全机制1、进程管理:内核负责创建和销毁进程, 并处理进程与输入和输出设备的不同进程间的数据处理, 调度器,控制进程如何共享 CPU, 是进程管理的一部分. 更通常地, 内核的进程管理活动实现了多个进程在一个单个或者几个 CPU 之上的抽象.2、内存管理:计算机的内存是主要的资源, 处理它所用的策略对系统性能是至关重要的. ...

weixin_34260991的博客 1870

系统架构_Linux 内核系统架构

描述Linux内核的文章已经有上亿字了但是对于初学者,还是应该多学习多看,毕竟上亿字不能一下子就明白的。即使看了所有的Linux 内核文章,估计也还不是很明白,这时候,还是需要fucking the code.28年前(1991年8月26日)Linus公开Linux的代码,开启了一个伟大的时代。这篇文章从进程调度,内存管理,设备驱动,文件系统,网络等方面讲解Linux内核系统架构。Lin...

weixin_35653679的博客 229
上一篇: 常用关键字:#define,const,typedef,using,inline
下一篇: Git 分支合并情况
JACKSONMHLN
博客等级 码龄9年 32粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值