linux内核源代码学习(4)关于一些数据结构和用户内存的管理

来源:互联网 发布:饼状图如何显示数据 编辑:程序博客网 时间:2024/06/05 05:37

《linux内核代码情景分析》的内存管理数据结构映射图linux内核源代码学习(4)关于一些数据结构和用户内存的管理

---flyli

      这两天工作忙啊,1.8k的基本工资,每天为了多赚绩效奖,老是加班,加班没有加班费,只能按干活的多少来算绩效领绩效奖,不过还算好了,至少不算是白加班吧。。。。

      看到我把工资晒出来,大家可能可以发现,原来我是个如此堕落的程序员。。。说实话,我也不想只拿这么一点,感觉还没在大学学校里当学生的时候拿的钱多。。。

       不过我还是相信很多过来人的话,“等你到了一定层次的时候,你会发现,刚走上社会拿的那些钱根本不值得一提。”,呵呵,找个理由偏偏自己吧

       好了!现在进入正题!

      前几篇文章主要介绍了在阅读MMU内存映射的时候遇到的一些不好理解的问题,现在就开始讲我们用户使用的内存是如何管理的了,和MMU映射的物理内存又有什么关系呢?

      用户程序中使用的内存被称之为“虚存”,因为他并不是实实在在的直接指向物理内存的,中间还要经历一道转换,还有就是要更利于管理。

      我们的“虚存”是如何管理的?它和MMU映射的内存,和物理内存的地址有什么区别呢?下面开始介绍。。

        我所说的用户空间的内存管理,其实就是给予一个进程的用户,每个进程都有一个自己的mm_struct结构,用于管理内存,其和内存有关的成员主要有2个,一个是这次提到的“虚存”(vm_area_struct)的链表,另外一个就是实际的内存映射地址(pgd_t)的数组,

       每一个vm_area_struct结构用于管理一个段连续的物理内存,当然不只是连续,而且其访问权限也必须是相同的哈,当有多个段的时候,此结构的链表就会进行扩展,其基本成员有,地址的起始位置与终止位置,以及下一个vm_area_struct结构体的指针,不过千万不要一位这些位置使用物理内存来表示的哦~~~~~其使用的是“虚存”,关于“虚存”和“pgd”的关系马上就会讲到

       一个mm_struct成员中除了有个虚存管理的结构外,还有就是一个pgd_t页面目录的数组了,这个数组是干什么的呢?他记录了该进程中所有的物理页面映射表。

      关于我们一般使用的malloc的具体过程我还没看到书上写的那部分,但是关于当堆栈区不够使用时,linux如何对其进行扩展我基本还是读懂了的。

      一个程序的用户区间划分如下图所示

linux程序空间定义示意图

      当堆栈的使用超出我们所规划的区间后,linux会判断这个超出的区间是正常的堆栈区需要扩展呢,还是访问出错,判断方法就是x86cpu指令中最长的也就是压栈32个字节,也就是说假如我们访问的栈是再距离以前的划分区间32以内就判断是合法的。

       之后呢,既然说他是合法的,linux就要给这些内存办“户口”啊~如何办呢?

       首先,由于在用户区,堆栈本来就是连续的(“虚存连续”),所以呢,我们不需要单独开辟一个vm_area_struct结构,直接对以前的堆栈结构进行修改就好了,如何修改呢?简单,肯定是改其起始位置了~~~当然之所以修改的是其实位置,其原因是因为堆栈的分配是自高向低扩展的,另外再修改写别的什么vm_area_struct区间的总页面数啊,之类的了,至此,“虚拟地址”的分配基本就完了~这就完了?其实中间省略了很多哈,不过都是无关的小东西,不必刻意研究了吧~

      虚拟内存的建立到时完了,可是我的映射物理页面怎么办呢?恩,这个就要和内存映射开始说起了,内存映射中,由于pgd是映射页面是初始化的时候就全部搞好的所以linux只需要用一个pgd_offset函数就可以找到,而pmd就不一定了,因为映射页面可能还没有建立,于是我们就需要用pmd_alloc函数开辟一个,这个函数和malloc很想吧~虽然实现方法千差万别,不过功能似乎很是相似啊,找到了pmd后,再用pte_alloc找到pte的结构就好了,至此一步一步的pgd,pmd,pte全部凑齐了,映射也就建立了。

      然而,映射的页面是4k的,而vm_area_struct是不一定多少位的连续区域,这个我们如何去把这两个联系起来呢,其实这个并不难,我们知道vm_area_struct中可以包含很多个连续的内存页面(“虚存层次上”),然而vm_area_struct链表中每个的开始位置和结束位置都是相连的,换言之就是连续的,这样就使得“虚存”的物理页面对应着连续的偏移量,通过这个偏移量做引索,或者说是数组下标,就可以再mm_struct结构中的pgd成员中找到对应的物理页面。

      哈哈,这几个概念终于被我理通了,不过假如有不对的地方,希望各位大侠千万不要吝惜笔墨,多多指正哈,在下感激不尽!!!!!!!!!!!

      最后送上《linux内核代码情景分析》的内存管理数据结构映射图哈

 

      

原创粉丝点击