理论+实例,带你掌握Linux的页目录和页表

本文详细介绍了Linux系统中x86架构的页目录和页表机制,通过理论结合实例的方式,解释了如何通过页目录和页表实现虚拟地址到物理地址的映射,以及在加载用户程序时的分配和填充过程。内容涵盖页表的拆分、页目录结构、相关寄存器的作用,以及线性地址到物理地址的转换计算过程。
摘要由CSDN通过智能技术生成
摘要:操作系统在加载用户程序的时候,不仅仅需要分配物理内存,来存放程序的内容;而且还需要分配物理内存,用来保存程序的页目录和页表。

本文分享自华为云社区《Linux从头学15:【页目录和页表】-理论 + 实例 + 图文的最完全、最接地气详解》,作者: 道哥 。

在x86系统中,为了能够更加充分、灵活的使用物理内存,把物理内存按照4KB的单位进行分页。

然后通过中间的映射表,把连续的虚拟内存空间,映射到离散的物理内存空间。

映射表中的每一个表项,都指向一个物理页的开始地址。

但是这样的映射表有一个明显的缺点:映射表自身也是需保存在物理内存中的。

在 32 位系统中,它使用了多达4MB的物理内存空间(每个表项4个字节,一共有4G/4K个表项)。

为了解决这个问题,x86处理器使用了两级转换:页目录和页表。

这篇文章,我们就从最基础的底层计算过程入手,把这个最重要的内存管理机制搞定,以后再学习更深入的知识点时,就会更容易理解了。

页表的拆分过程

在一个32位的系统中,物理内存的最大可表示空间就是0xFFFF_FFFF,也就是4GB。

虽然实际安装的物理内存可能远远没有这么大,但是在设计内存管理机制的时候,还是需要按照最大的可寻址范围来进行设计的。

按照一个物理页4KB的单位来划分,4GB空间可以分割为1024* 1024个物理页:

在上一篇文章中,使用单一的映射表来指向这些物理页,导致了映射表自身占据了太多的物理内存空间。

一个用户程序中定义的几个段,可能实际上只使用了很小的空间,完全用不到 4 GB。

但是仍然需要为它分配多达 4GB 的物理内存空间来保存这个映射表,很浪费。

为了解决这个问题,可以把这个单一映射表拆分成1024个体积更小的映射表:

每一个映射表中,只有 1024 个表项,每一个表项仍然指向一个物理页的起始地址;

一共使用 1024 个这样的映射表;

这样一来,1024(每个表中的表项个数) *1024(表的个数),仍然可以覆盖4GB的物理内存空间。

这里的每一个表,就称作页表,所以一共有1024个页表。

一个页表中一共有1024个表项,每一个页表项占用4个字节,所以一个页表就占用4KB的物理内存空间,正好是一个物理页的大小。

也许有的小伙伴就开始算账了:一个页表自身占用4KB,那么1024个页表一共就占用了4MB的物理内存空间,仍然是很多啊?

是的,从总数上看是这样,但是:一个应用程序是不可能完全使用全部的 4GB 空间的,也许只要几十个页表就可以了。

例如:一个用户程序的代码段、数据段、栈段,一共就需要10 MB的空间,那么使用3个页表就足够了,加上页目录,一共需要16 KB的空间。

计算过程:

每一个页表项指向一个 4KB 的物理页,那么一个页表中 1024 个页表项,一共能覆盖 4MB 的物理内存;

那么 10MB 的程序,向上对齐取整之后(4MB的倍数,就是 12 MB),就需要 3 个页表就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值