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);

    这样就能够减小页表的空间消耗;

Guess you like

Origin blog.csdn.net/kissland96166/article/details/132285255