32位逻辑地址空间到物理空间映射关系

前言:

这篇博文可以在你基本了解逻辑地址空间和物理地址空间的概念后,为增强理解可通过我画的示意图来理解,本文会深入一些概念,以达到全面掌握该映射关系的目的。画图不易鸭,点个赞再走呗(✿◡‿◡)

逻辑地址空间及物理地址空间映射关系:

一、关系图

32位逻辑地址空间到物理空间映射关系_第1张图片

我们编写的 .c 文件,经过gcc编译后会生成一个 .s 文件,在 linux 环境下可通过 size 命令来查看其逻辑空间布局,也就是说,在你的程序运行前逻辑地址已经分配好了,如下图所示,但是物理空间的使用情况是不定的。

如果不清楚程序的执行流程,参见下图,也可以去具体查看一下每部分生成的内容,更有助于理解:

32位逻辑地址空间到物理空间映射关系_第2张图片

之前我有博客也画出过程序加载时的流程图,有兴趣可以回炉一下,简单的说,会经历一下流程:创建进程task_stuct;操作系统通过sys_exec对可执行文件进行映射;加载,包括页表的创建及写入操作;替换策略,目前linux仍使用的是LRU策略。

原程序.c文件经历的几个历程:

1.预处理:展开头文件/宏替换/去掉注释/条件编译                      (test.i main .i)

2.编译:   检查语法,生成汇编                                                   ( test.s  main .s)

3.汇编:   汇编代码转换机器码                                                     (test.o main.o)

4.链接:   链接到一起生成可执行程序                                          a.out

二、用户逻辑地址空间中的一些概念

看到一篇博文关于这部分内容讲的比较基础,可以参考一下:https://blog.csdn.net/yusiguyuan/article/details/45155035。这篇文章貌似是篇译文,之所以引用,也是其中有关于堆栈的对比,还是很用心的,如下图所示:

32位逻辑地址空间到物理空间映射关系_第3张图片

当然在c语言中使用的 malloc/free,亦或是在c++中使用的 new/delete,都是针对堆来进行操作的,对于不同大小的请求,也会被分解到不同的函数来做下一步处理,对于brk()和mmap()感兴趣的可以再具体看一下,它们申请获得的是一片连续的逻辑地址空间,如果想要真正的获得物理内存,还需要操作系统提供的伙伴系统和slab分配器,这样的内核分配器。为了更直观的展示逻辑关系,找了一篇博文中的图片:

32位逻辑地址空间到物理空间映射关系_第4张图片

这个图确实太糊了,但是找不到真正的原作者在哪篇博文里的给出这幅图,所以只能这样展示给大家了。

 

 

结语:

罗列几篇自己看了还觉得不错的博文给大家:

https://blog.csdn.net/szu_tanglanting/article/details/16339809

https://blog.csdn.net/yusiguyuan/article/details/45155035

https://blog.csdn.net/weixin_41143631/article/details/81221777

关于页表部分的内容,其实好的博文也很多,在此就不赘述了。感谢。

你可能感兴趣的:(页表管理)