虚拟存储器和进程虚拟空间的关系:
博客一篇,以感谢一直来,老朱的理解和鼠娘繁忙工作外解决我的提问。虽然你没有答应我对你如此尊称时不揍我一顿;即使盛装的你招摇过市时,在呼叫声中 偶尔也有我的;但即便如此,湘江之水也表达不完我对你的绵绵敬意。
特此,致礼。
虚拟存储器长什么样?
虚拟存储器其实是硬盘存储空间的表现形式。就好像课室的桌椅以编号记录在本子上。桌椅是一张接一张的排着,本子上就记着1,2,3......;虚拟存储器也是用1,2,3......N标记磁盘的的每一个字节(存储空间)。这些标号简称虚拟地址。
虚拟存储器的页: 1~10号的桌椅摆满课室的一行,所以,课室的桌椅可以分成佷多行;同理,因为空间地址大小为 1~10的虚拟存地址“被页了”,虚拟存储器满满的都是页(1,2 ,3,....., N/10
虚拟存储器的域: 假设三间教室是教学楼的一层,眼识教学楼高三层,教室总数真在处理中;选出某几个连续的页作为一个域,我们可以建立十几个域(不要太贪心吓!)
域和可执行文件的映射: 老师安排一层的教室考数学,二层中文,三层“英格力士”;于是存储总管创建域中选择某个域映射为可执行文件指令段,某某域映射数据段,某某域是“堆堆"段,某某域是“栈栈"段,还有共享库域......
(补:存储器映射的定义是,把磁盘的数据对象和虚拟存储区域关联起来,初始化虚拟存储区域,使这个区域的每个地址有指向的对象。这个过程就叫做存储器映射)
由此可知,桌椅的n号和n号桌椅 是不同的。有没有想到指针和指针指想的对象,对了就是他们: 数据对象和数据属性(地址) 的区别。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
那么如何让程序“进程”起来呢?进程就是正在运行的程序。
进程的创建三部走:
1、内核为每个进程创建独立的虚拟地址空间
2、读取可执行文件头,把虚拟空间和可执行文件映射起来
3、装载可执行文件,程序入口地址装到指令寄存器,CPU走起!
-------------------------------------------------------------------------------------
创建:用一种数据结构,表达出可执行文件的内容的位置
内核为进程维护一个task_struct,有一个task_struct结构成员mm指向结构体mm_struct,mm_struct结构保存当前进程的虚拟存储器的使用状态信息,其中mm_struct的成员pgd和mmap分别指向以一级页表的基址和指向vm_area_structs(区域结构)链表。
内核创建进程虚拟空间的真正动作是:内核创建相应的数据结构,使其指向可执行文件的相应位置。CPU只要读虚拟地址地址指向的数据,MMU解析虚拟地址,找到缓存在内存中的进程的数据结构内容,就知道可执行文件的相应部分有没有存到内存空间。
要知道存储器的对象由磁盘控制器DMA到内存里面的,不关我们事。
--------------------------------------------------------------------------------------------------------
映射:把可执行文件的内容和内存的某个域建立关系
可执行文件的进程的虚拟空间和可执行文件的映射关系数据是用数据结构完成的。名叫:vm_area_structs,这个数据结构保存了进程虚拟空间和可执行文件的映射关系。
虚拟存储空间的一个段,即vm_area_tructs链表中的一结点,叫做虚拟内存区域(VMA).进程虚拟空间的一个段对应可执行文件的一个段。
--------------------------------------------------------------------------------------------------------------
装载程序,进程环境初始化,上下文切换。
CPU到达main的入口遇到的情况:缺页及处理
CPU执行寄存器中地址指向的进程第一个指令,MMU依地址在此进程的数据结构pgd指向的页表条目,结果是无效的(进程开始执行都是这样的)。CPU把控制权交给操作系统,操作系统查询缺页对应在此进程中的vm_area_tructs结构,确定缺页所在的进程虚拟存储区域,然后把虚拟存储区域对应的可执行文件的段的一个偏移值处的所缺的页面调入开辟好的内存区域。CPU再来一次操作即可。
就像学生拿着数学的准考证到教学楼,发现到一层的楼梯们没开(缺页故障),等到门被打开(缺页处理程序),还要找到有自己名字的课室的座位(地址翻译),如是开始考试。
当中还有诸多细节留待补充(地址翻译,加载过程,链接过程,ELF文件格式)