文章目录

  • 1. 物理地址和虚拟地址定义
  • 2. 虚拟地址空间分布
    • 2.1 内核空间
    • 2.2 栈(stack)
    • 2.3 堆(heap)
    • 2.4 BSS段
    • 2.5 数据段(Data)
    • 2.6 代码段(text)
    • 2.7 保留区
  • 3. 分段式存储
    • 3.1 分段式存储定义
    • 3.2 分段式存储示例
    • 3.3 分段式存储优缺点
  • 4. 分页式存储
    • 4.1 分页式存储定义
    • 4.2 分页式存储示例
    • 4.3 分页式存储优缺点

1. 物理地址和虚拟地址定义

物理地址 (physical address): 放在寻址总线上的地址。放在寻址总线上,如果是读,电路根据这个地址每位的值就将相应地址的 物理内存中的数据放到 数据总线中传输。如果是写,电路根据这个地址每位的值就在相应地址的 物理内存中放入 数据总线上的内容。 物理内存是以 字节(8位)为单位 编址的。

虚拟地址 (virtual address): CPU启动 保护模式后,程序运行在虚拟 地址空间中。注意,并不是所有的“程序”都是运行在虚拟地址中。CPU在启动的时候是运行在实模式的,Bootloader以及内核在初始化页表之前并不使用虚拟地址,而是直接使用物理地址的。

2. 虚拟地址空间分布

2.1 内核空间

内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留,不允许应用程序读写该区域的内容或直接调用内核代码定义的函数。

2.2 栈(stack)
  • 栈是由高地址向低地址扩展的连续内存,栈的大小一般为 2M 或者 10M。

  • 栈内存是由系统分配,系统释放的,以函数为单位进行栈内存分配,函数栈帧,局部变量,形参变量等都存放在栈内存上。

  • 栈的内存分配释放速度快效率高,内存都是连续的。

2.3 堆(heap)
  • 堆是由低地址向高地址扩展的非连续内存,堆的大小影响的因素比较多,和系统虚拟内存的大小有关系。

  • 堆内存是由用户自己分配的,C 语言用 malloc/free进行分配释放,C++用 new/delete 进行分配释放,由于堆需要用户自己管理,因此堆内存很容易造成内存泄露,而栈内存不会。

  • 堆内存的分配释放相对于栈来说效率低一些,内存不一定连续,容易产生内存碎片,但是灵活性高。

2.4 BSS段

BSS(Block Started by Symbol)段中通常存放程序中以下内容

  • 未初始化的全局变量和静态局部变量

  • 初始值为0的全局变量和静态局部变量(依赖于编译器实现)

  • 未定义且初值不为0的符号(该初值即common block的大小)

2.5 数据段(Data)

数据段通常用于存放程序中已初始化且初值不为0的全局变量和静态局部变量。数据段属于静态内存分配(静态存储区),可读可写。

数据段保存在目标文件中(在嵌入式系统里一般固化在镜像文件中),其内容由程序初始化。例如,对于全局变量int gVar = 10,必须在目标文件数据段中保存10这个数据,然后在程序加载时复制到相应的内存。

2.6 代码段(text)

代码段也称正文段或文本段,通常用于存放程序执行代码(即CPU执行的机器指令)。

2.7 保留区

位于虚拟地址空间的最低部分,未赋予物理地址。任何对它的引用都是非法的,用于捕捉使用空指针和小整型值指针引用内存的异常情况。

3. 分段式存储

3.1 分段式存储定义

段式管理(segmentation),是指把一个程序分成若干个段(segment)进行存储,每个段都是一个逻辑实体(logical entity),程序员需要知道并使用它。它的产生是与程序的模块化直接有关的。段式管理是通过段表进行的,它包括段号或段名、段起点、装入位、段的长度等。此外还需要主存占用区域表、主存可用区域表。

3.2 分段式存储示例

假设有两个进程 A 和 B ,进程 A 所需内存大小为 10M ,其虚拟地址空间分布在 0x00000000 到 0x00A00000 ,进程 B 所需内存为 100M ,其虚拟地址空间分布为 0x00000000 到 0x06400000 。那么按照分段的映射方法,进程 A 在物理内存上映射区域为 0x00100000 到 0x00B00000 ,,进程 B 在物理内存上映射区域为 0x00C00000 到 0x07000000 。于是进程 A 和进程 B 分别被映射到了不同的内存区间,彼此互不重叠,实现了地址隔离。从应用程序的角度看来,进程 A 的地址空间就是分布在 0x00000000 到 0x00A00000 ,在做开发时,开发人员只需访问这段区间上的地址即可。应用程序并不关心进程 A 究竟被映射到物理内存的那块区域上了,所以程序的运行地址也就是相当于说是确定的了。

3.3 分段式存储优缺点
  1. 优点
    在段式存储管理中,每个段地址的说明为两个量:一个段名和一个位移。在段内,是连续完整存放的。而在段与段之间是不一定连续编址的。段名和位移构成了一种二维编址。 段式管理是不连续分配内存技术中的一种。其最大特点在于他按照用户观点,即按程序段、数据段等有明确逻辑含义的“段”,分配内存空间。克服了页式的、硬性的、非逻辑划分给保护和共享与支态伸缩带来的不自然性。 段的最大好处是可以充分实现共享和保护,便于动态申请内存,管理和使用统一化,便于动态链接。

  2. 缺点
    (1) 有内存碎片产生问题。
    (2) 在分段的映射方法中,每次换入换出内存的都是整个程序, 这样会造成大量的磁盘访问操作,导致效率低下。

4. 分页式存储

4.1 分页式存储定义

将各进程的虚拟空间划分成若干个长度相等的页(page),页式管理把内存空间按页的大小划分成片或者页面(page frame),然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理。

4.2 分页式存储示例

一个可执行文件 (PE 文件 ) 其实就是一些编译链接好的数据和指令的集合,它也会被分成很多页,在 PE 文件执行的过程中,它往内存中装载的单位就是页。在 PE 文件的第一页包含了 PE 文件头和段表等信息,进程根据文件头和段表等信息,将 PE 文件中所有的段一一映射到虚拟地址空间中相应的页 (PE 文件中的段的长度都是页长的整数倍 ) 。这时 PE 文件的真正指令和数据还没有被装入内存中,操作系统只是根据 PE 文件的头部等信息建立了 PE 文件和进程虚拟地址空间中页的映射关系而已。当 CPU 要访问程序中用到的某个虚拟地址时,当 CPU 发现该地址并没有相相关联的物理地址时, CPU 认为该虚拟地址所在的页面是个空页面, CPU 会认为这是个页错误 (Page Fault) , CPU 也就知道了操作系统还未给该 PE 页面分配内存, CPU 会将控制权交还给操作系统。操作系统于是为该 PE 页面在物理空间中分配一个页面,然后再将这个物理页面与虚拟空间中的虚拟页面映射起来,然后将控制权再还给进程,进程从刚才发生页错误的位置重新开始执行。由于此时已为 PE 文件的那个页面分配了内存,所以就不会发生页错误了。随着程序的执行,页错误会不断地产生,操作系统也会为进程分配相应的物理页面来满足进程执行的需求。

4.3 分页式存储优缺点
  1. 优点
    (1) 由于它不要求作业或进程的程序段和数据在内存中连续存放,从而有效地解决了碎片问题。
    (2) 动态页式管理提供了内存和外存统一管理的虚存实现方式,使用户可以利用的存储空间大大增加。这既提高了主存的利用率,又有利于组织多道程序执行。

  2. 缺点
    (1) 要求有相应的硬件支持。例如地址变换机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。
    (2) 增加了系统开销,例如缺页中断处理机。
    (3) 请求调页的算法如选择不当,有可能产生抖动现象。
    (4) 虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用果页面较大,则这一部分的损失仍然较大。

【Linux】虚拟地址空间相关推荐

  1. linux虚拟地址空间管理,Linux内存管理4---虚拟地址空间管理

    1.前言 本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理. 本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础.虚拟地址空间的管理.物理地址空间的管理. 本 ...

  2. linux 虚拟地址空间在哪,Linux虚拟地址空间

    Linux虚拟内存管理(glibc) 在使用mysql作为DB开发的兑换券系统中,随着分区表的不断创建,发现mysqld出现了疑似"内存泄露"现象,但通过 valgrind 等工具 ...

  3. Linux虚拟地址空间

    目录 父子进程地址相同的变量值不同问题 运行结果 Linux下进程虚拟地址空间分布 什么是虚拟地址空间? 进程直接访问物理内存(无虚拟空间) 再述虚拟地址空间! 虚拟地址空间结构体是如何区域划分? 解 ...

  4. [memory]虚拟地址空间分布

    一.开篇 踏入嵌入式软件行业也接近2年了,从研一开学起懵懵懂懂的開始学习C语言.因为本科时对这方面了解的少之又少,所以学起来比較困难.可是有一群无私奉献的小伙伴,慢慢的,慢慢的,慢慢的,一仅仅脚踏进了 ...

  5. linux进程地址空间没有段,Linux进程的虚拟地址空间

    在x86体系结构中分段机制是必选的,而分页机制则可由具体的操作系统而选择,Linux通过让段的基地址为0而巧妙的绕过了基地址.因此,对于Linux来说,虚地址和线性地址是一致的.在32位的平台上,线性 ...

  6. Linux进程虚拟地址空间

    1. 前言 谈到Linux进程虚拟地址空间,还要从程序说起.本文通过分析程序的编译执行过程,分享了Linux进程虚拟地址空间的结构.组织和创建,并通过分析Linux内核源代码,总结了进程.进程虚拟地址 ...

  7. 【Linux 内核 内存管理】虚拟地址空间布局架构 ① ( 虚拟地址空间布局架构 | 用户虚拟地址空间划分 )

    文章目录 一.虚拟地址空间布局架构 二.用户虚拟地址空间划分 一.虚拟地址空间布局架构 在 646464 位的 Linux 操作系统中 , " ARM64 架构 " 并 不支持 6 ...

  8. 【Linux 内核】进程管理 ( 进程与操作系统 | 进程与程序 | 进程与线程 | 虚拟地址空间 )

    文章目录 一.进程与操作系统 二.进程与程序 三.进程与线程 四.虚拟地址空间 一.进程与操作系统 操作系统与硬件的关系 : 操作系统 使用 硬件 提供的资源 , 如 CPU , 内存 , 磁盘 , ...

  9. Linux虚拟内存和进程虚拟地址空间简述

    后台开发经常会问此类问题,虽说难度不大,但是知道和不知道还是有区别的.以下的内容总结自<深入理解Linux内核>第一章,仅仅是简述,没有深入研究,毕竟内存管理这一块内容超级多,感兴趣的同学 ...

  10. linux gpu 地址空间,显卡内存和进程的虚拟地址空间

    datenwolf.. 6 我的游戏应用程序虚拟地址空间如何? 无法分辨.OpenGL将这个细节完全公开给供应商实现.允许满足规范的任何内容. 显卡内存是否映射在此虚拟地址空间中? 也许,也许不是.这 ...

最新文章

  1. 【原】移动端界面的适配
  2. 什么是SVC模式【转】
  3. spark集群启动正常,但是提交任务后只有一个节点(slave/worker)参与集群计算
  4. C#获取Windows下光标位置(转)
  5. 分治法:归并排序求逆序对
  6. JS void运算符
  7. tomcat java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListen
  8. 区块链如何推动人力资源和薪酬管理体系变革?
  9. e站host地址_IP地址和物理地址的区别和联系
  10. 注册smtp服务器,SMTP授权码介绍及获取教程
  11. 试用DreamWeaver CS6
  12. LAIC2022司法人工智能挑战赛 - 司法文本小样本多任务Baseline
  13. 中央C-高低音谱号里的中央C和其它音节
  14. 如何拿到阿里offer的?面试流程及面试题
  15. 随机邻域嵌入_诠释数据降维算法:一文讲尽t-分布邻域嵌入算法(t-SNE)如何有效利用-阿里云开发者社区...
  16. html语言下上标对齐,HTML 标记语言全面详细解 一天学会
  17. Redis中RDB操作
  18. 单片机的停车场计数系统c51_基于51单片机的停车场车位管理系统
  19. 计算机专业的自考财务管理有用吗,自考财务管理学难吗
  20. 【408计算机考研】操作系统——第一章 计算机系统概述

热门文章

  1. Qt实现基本QMainWindow主窗口程序
  2. Java Web开发小结
  3. [Python图像处理] 五.图像融合、加法运算及图像类型转换
  4. 【数据结构与算法】之深入解析“石子游戏IX”的求解思路与算法示例
  5. 【数据结构与算法】之深入解析“石子游戏VI”的求解思路与算法示例
  6. Swift之深入解析Xcode13对Swift对象生命周期的优化
  7. App设计灵感之十二组精美的地图导航App设计案例
  8. 搭建 Django 开发环境
  9. 信息学奥赛一本通(C++)在线评测系统——基础(二)基础算法 —— 1313:【例3.5】位数问题
  10. 【Tools】VNC Viewer 6.20安装详解