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

  1. 虚拟内存

所有新近的Unix系统都提供了一种有用的抽象,叫虚拟内存(virtual memory)。虚拟内存作为一种逻辑层,处于应用程序的内存请求与硬件内存管理单元(Memory Management Unit, MMU)之间。虚拟内存有很多用途和优点:

  • 若干个进程可以并发地执行。
  • 应用程序所需内存大小大于可用物理内存时也可以运行。
  • 程序只有部分代码装入内存时进程也可以执行它。
  • 允许每个进程访问可用物理内存的子集。
  • 进程可以共享库函数或程序的一个单独内存映像。
  • 程序是可重定位的,也就是说,可以把程序放在物理内存的任何地方。
  • 程序员可以编写与机器无关的代码,因为他们不必关心物理内存的组织结构。

虚拟内存子系统的主要成分是虚拟地址空间(virutal address space)的概念。进程所用的一组内存地址不同于物理内存地址。当进程使用一个虚拟地址时,内核和MMU协同定位其在内存中的实际物理位置。

现在的CPU包含了能自动把虚拟地址转换成物理地址的硬件电路。为了达到这个目标,把可用RAM划分成4KB或8KB的页框(page frame),并且引入一组页表来指定虚拟地址和物理地址之间的对应关系。这些电路使得内存分配变得简单,因为一块连续的虚拟地址请求可以通过分配一组非连续的物理地址页框而得到满足。

2.        进程虚拟地址空间处理

进程的虚拟地址空间包括了进程可以引用的所有虚拟内存地址。内核通常用一组内存区描述符(mm_struct)描述进程虚拟地址空间。例如,当进程通过exec()类系统调用开始某个程序的执行时,内核分配给进程的虚拟地址空间由以下几个内存区组成:

  • 程序的可执行代码。
  • 程序的初始化数据。
  • 程序的未初始化数据。
  • 初始程序栈(即用户态栈)
  • 所需共享库的可执行代码和数据(此部分并不实际拷贝,仅仅时映射)
  • 堆(由程序动态请求的内存)

所有现代Unix操作系统都采用了所谓请求调页(demand paging)的内存分配策略。有了请求调页,进程可以在它的页还没有在内存时就开始执行。当进程访问一个不存在的页时,MMU产生一个异常:异常处理程序找到受影响的内存区,分配一个空闲的页,并用适当的数据把它初始化。同理,当进程通过malloc或者brk系统调用动态的请求内存时,内核仅仅修改进程的堆内存区的大小。只有试图引用进程的虚拟内存地址而产生异常时,才给进程分配页框。

参考目录:

1. 《深入理解Linux内核》

2. 《Linux设备驱动程序》​​​​​​​

=============================================================================================

Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。

Linux虚拟内存和进程虚拟地址空间简述相关推荐

  1. Linux进程虚拟地址空间

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

  2. 【Linux】进程虚拟地址空间

    进程虚拟地址空间打破了我一直以来对于程序地址空间的认识,它真的好神奇. 我们首先来看一下下面这段代码: 1 #include<stdio.h>2 #include<unistd.h& ...

  3. 【读书笔记】【程序员的自我修养 -- 链接、装载与库(二)】进程虚拟地址空间、装载与动态链接、GOT、全局符号表、共享库的组织、DLL、C++与动态链接

    文章目录 前言 介绍 可执行文件的装载与进程 进程虚拟地址空间 装载方式 操作系统对可执行文件的装载 进程虚存空间分布 ELF文件的链接视图和执行视图 堆和栈 Linux 内核装载ELF & ...

  4. 2.4父子进程虚拟地址空间情况

    内核区中,父进程和子进程的pid是不同的. 定义的局部变量pid在栈空间中,父子进程中栈空间中的pid不同,在父进程中为子进程的进程号,在子进程中为0 实际上,更准确来说,linux的fork()是通 ...

  5. 父子进程虚拟地址空间情况

    父子进程虚拟地址空间情况 笔记来源于牛客网<Linux多进程开发> The child process and the parent process run in separate mem ...

  6. 【Linux从无到有】进程的地址空间

    地址空间想必大家听的耳朵都起茧子了,栈区.堆区.静态区--其实这还有很的秘密,或许他会颠覆你的认知,那么就一起来探索吧 文章目录 进程地址空间 什么是虚拟地址空间 ? 浅谈页表 以现在的视角在看程序 ...

  7. 进程虚拟地址空间之数据分区存放【转】

    转自:http://blog.csdn.net/bullbat/article/details/7318269 作者:bullbat 在前面的<对一个程序在内存中的分析 >中很好的描述了程 ...

  8. linux和windows的进程的虚拟地址空间

    昨晚看到了深夜,终于对进程的虚拟地址空间有了个大致的了解,很激动,也很欣慰.回头想来,一个程序员,真的应该知道这些知识,否则还真不太称职. 首先告诉大家,我后面提到的这些知识在<windows核 ...

  9. 【Linux系统编程】进程地址空间和虚拟地址空间

    00. 目录 文章目录 00. 目录 01. 早期的内存分配机制 02. 分段 03. 分页 04. 地址比较 05. 附录 01. 早期的内存分配机制 在早期的计算机中,要运行一个程序,会把这些程序 ...

最新文章

  1. Debian/Ubuntu--blade安装与使用
  2. pairplot 中参数hue的作用就是在图像中将输出的散点图按照hue指定的特征或标签的类别的颜色种类进行区分
  3. dSploitzANTI渗透教程之启动zANTI工具
  4. 查看TensorFlow的版本和路径
  5. @transactional 接口_Spring事物(@transactional注解)在什么情况下会失效,为什么?...
  6. 阿里启动NASA计划创造新经济核心科技
  7. 软考系统架构师笔记-最后知识点总结(四)
  8. 逗比学树莓派之GPIO
  9. r语言 list添加_R语言里面双层list变成长形数据框
  10. 月薪2W和月薪10W的差别,怎么判断一个产品经理的专业水平高低?
  11. Swift中类与结构的初始化
  12. 提高数据质量的方法有哪些
  13. python关机_Python 神操作: 远程开机和关机
  14. 谷歌宣布Kotlin成安卓开发一级语言,我们如何来学习它
  15. Java铬钼钢车架几何_车架的几何尺寸
  16. PCB工程师为你详解FPC排线及其用途
  17. 电脑网速正常就是打开网页慢是什么原因啊?
  18. 判断输入的邮箱格式是否正确
  19. Vue中报如下错误Uncaught (in promise) NavigationDuplicated解决方案
  20. BAT 遍历文件夹和子文件夹下所有文件

热门文章

  1. 电磁学讲义2:库仑定律
  2. java Locale 解析方法
  3. .NET速度的问题,不是最重要的
  4. 南京晓庄学院大一第二学期计算机数据结构期末考试试卷及答案,南京晓庄学院数据结构题库参考标准答案...
  5. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第10章-滤波器设计
  6. 【Matlab】图添加箭头指示
  7. 【Paper】2004_Information Flow and Cooperative Control of Vehicle Formations
  8. PyTorch 实现经典模型1:LeNet5
  9. 1.1 欢迎-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
  10. 云服务器+开发板搭建直播系统,自建流媒体服务器开直播