Linux知识点 – 进程概念(补充)
文章目录
- Linux知识点 -- 进程概念(补充)
- 一、进程地址空间的堆区
- 二、虚拟地址到物理地址之间的转化
- 三、虚拟地址到物理地址之间的映射
一、进程地址空间的堆区
在用户每次使用malloc等函数在进程的堆区申请地址时,用户只需要指定空间的大小,并且会得到一个起始地址,而不会得到结束地址;
-
因为堆区的结构都是由vm_area_struct管理的,每次malloc都会申请一个该结构体;
-
malloc在堆上申请空间时,只需要知道起始地址,不需要知道结束地址,就是因为vm_area_struct中保存了start和end;
-
堆区申请的空间都是连续的;
二、虚拟地址到物理地址之间的转化
- 磁盘上的空间都是以4KB为单位的,我们的可执行程序存储在磁盘上,其实它本来就是按照地址空间的方式进行编译的,可执行程序也被划分成了以4KB为单位的区域,存储在磁盘上;
- 物理内存也是按照4KB划分的,OS是通过struct page结构体对物理内存的各个单元进行管理的;
- 磁盘上的一个4KB单位叫做页帧,物理内存上的一个4KB单位叫做页框;
- IO的时候,基本单位就是4KB,就是将页帧装进页框;
- 当OS通过页表进行寻址时,发现对应地址的文件不在内存中,就需要引发缺页中断:
(1)申请对应的内存;
(2)在磁盘中查找对应的文件;
(3)加载到内存中指定的位置;
(4)重新填充页表;
(5)返回到用户;
三、虚拟地址到物理地址之间的映射
页表中一个地址的映射叫做一个条目,假设一个条目大小为9byte(虚拟地址 + 物理地址 + 属性),32位地址下一共2^32个条目,就是4GB个条目,一共就是36GB的页表空间,内存中无法保存这么大的页表;
- 实际上,OS在虚拟地址到物理地址的映射上,是将虚拟地址划分的:
虚拟地址的前十个bit位在一级页表进行索引,一级页表的映射关系一共2^10,就是1024个;
一级页表映射到二级页表,再在对应的二级页表中检索中间的10bit地址;
二级页表映射到物理内存的某个页的起始地址;
后12位地址代表这个地址的页内偏移(因为2^12 = 4KB);
这样就能够减小页表的空间消耗;