linux操作系统——页表的深入理解
Posted 努力学习的少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。
接下来我们在补充一个知识点,磁盘上的程序和内存交换是以页框大小进行交互的,编译器在编译生成一个可执行程序的时候,编译器会将可执行程序以页框的大小进行划分,当可执行程序加载到我们的内存时,是以页框为单位加载进我们的内存。
种一颗树最好是十年钱,其次是现在!!!
大家一起加油!!!
以上是关于linux操作系统——页表的深入理解的主要内容,如果未能解决你的问题,请参考以下文章
Linux进程概念——下验证进程地址空间的基本排布 | 理解进程地址空间 | 进程地址空间如何映射至物理内存(页表的引出) | 为什么要存在进程地址空间 | Linux2.6内核进程调度队列