【linux操作系统】——页表的深入理解

               🍎作者:努力学习的少年

 🍎个人简介:双非大二,一个正在自学c++和linux操作系统,写博客是总结知识,方便复习

 🍎目标:进大厂

 🍎 如果你觉得文章可以的话,麻烦你给我点个赞和关注,感谢你的关注!

 

在每一个进程中,每个进程都有自己的虚拟内存空间,该内存空间能使进程与进程之间相互独立,互不影响,当运行一个进程的时候,cpu是先看到进程的虚拟内存上的数据,然后在通过页表的映射关系找到物理内存中代码和数据,而页表就是将虚拟地址和物理地址建立起映射关系

今天我们要讲的是虚拟地址与物理地址是怎样进行映射的呢。我们以32位linux的操作系统为例。

在32位的平台下,每个地址都是32个字节,那么虚拟内存上就有2^32个虚拟地址,也就是有2^32对映射关系。

假设我们只有一张页表是将虚拟地址和物理地址建立映射关系,那么这张表就有2^32对页表项,每对页表项大约为10个字节,那么这张表就是40个gb,这显然是不可能的,因为物理内存也就才几个g。

然而实际上页表不只有一张,虚拟地址与物理地址的对应方式如下:

为了更好的描述虚拟地址是与物理地址是怎样对应的,我们假设有下面这个虚拟地址。

 首先,虚拟地址的前10个bit位是用来查找一级页表中的对应的页表项每个一级页表的表项对应的是一张一张的二级页表。一级页对应的表项有2^10个,所以一级页表的大小为2^10x10,为10kb。

一级页表项存储的是二级页表,查完一级页表后,我们就可以找到对应的二级页表,然后我们根据虚拟地址中11~20比特位找到二级页表中的对应的页表项,二级页表的页表项对应的是物理内存中的一个一个的页框,每个物理页框的大小是4个kb,所以通过二级页表和虚拟地址中的11~20的bit位就能找到物理内存中页框。二级页表的也是有2^10个对应关系,所以每一张二级页表的大小也是为10kb

通过二级页表我们找到物理内存上某一页框后,然后我们在通过虚拟地址的最后12个bit位的找到页框中具体哪一个字节每个页框的大小是4kb,它是由2^12字节组成,对应每个虚拟地址中的最后12个bit位。这样我们通过页表将虚拟地址和物理地址 一一相对应起来。

 在一级页表中,并不是所有的页表项都有映射关系,如果一级页表中的页表项没有映射关系,那么就不会存在相对应的二级页表,所以最多有2^10张二级页表,一级页表只有一张,因此页表的大小最大也是10*2^10,也就是10mb。

 

接下来我们在补充一个知识点,磁盘上的程序和内存交换是以页框大小进行交互的,编译器在编译生成一个可执行程序的时候,编译器会将可执行程序以页框的大小进行划分,当可执行程序加载到我们的内存时,是以页框为单位加载进我们的内存。

种一颗树最好是十年钱,其次是现在!!!

大家一起加油!!!

 

评论 1 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:终极编程指南 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值