linux 内核启动 分页,Linux中的分页|Linux Kernel Architecture 内核笔记

本文详细介绍了Linux内核如何在32位和64位系统中实现分页,从早期的两级分页到后来的三级和四级分页模型。在64位系统中,四级分页模型用于支持更大的线性地址空间。通过页全局目录、页上级目录、页中间目录和页表,Linux实现了线性地址到物理地址的转换,确保每个进程都有独立的地址空间。在进程切换时,通过更新cr3寄存器来切换页表,从而实现进程间内存隔离。
摘要由CSDN通过智能技术生成

Linux采用了一种兼容32位和64位系统的普通分页模型。在32位系统模型中,两级分页已经足够了,但在64位系统中需要更多的分页级别。直到2.6.10版本,Linux采用三级分页模型,从2.6.11之后,采用了四级分页模型

页全局目录(Page Global Directory)

页上级目录(Page Upper Directory)

页中间目录(Page Middle Directory)

页表(Page Table)

页全局目录包含若干页上级目录的地址,页上级目录又包含页中间目录的地址,依次类推,页中间目录则包含页表的目录地址。而每个页表指向一个页框。线性地址因此被划分成五个部分。下图的线性地址并没有显示位数,因为每一部分的大小跟具体的计算机体系结构相关。

144826342_1_20180920055503363.png

Linux中的分页

上图显示了一个Linux的四级分页中是如何通过页目录找到页表然后寻址到相应的页。实际上,和之前两级分页的概念一样。针对32位系统。Linux取消了上级页目录和中间页目录字段。不过,页上级目录和页中间目录在指针中的位置被保留,以便同样的代码在32位系统和64位系统下都能使用。

内核位页上级目录和页中间目录保留了一个位置,这是通过它们的页目录项数设置位1,并把这两个目录项映射到页全局目录的一个适当的目录项而实现的。

启用了物理地址扩展的32位系统使用了三级页表,Linux的全局页目录对应80x86的页目录指针表(PDPT),取消了页上级目录,页中间目录对应80x86的页目录,Linux的页表对应80x86的页表。

最后,64位系统使用三级还是四级目录取决于硬件对线性地址的划分。

Linux的进程处理依赖于分页,实际上,线性地址到物理地址的自动转换使得下面的设计目标得以实现:

给每一个进程分配一块不同的物理地址空间,确保了可以有效地防止寻址错误。

区别页和页框

每一个进程有它自己的页全局目录和自己的页表集,当发生进程切换时,Linux把cr3寄存器的内容保存在前一个执行进程的描述符中,然后把下一个要执行进程的描述符的值装入到cr3寄存器中。因此当新进程重新开始在CPU上执行时,分页单元指向一组正确的页表。

线性地址字段,页表处理的函数和宏我就不列举了,可能在以后的(如果我深入了解内存管理的话)会再补充,这里只是笔记。

这个变化用来全力支持x86_64平台使用的对线性地址的划分。 ↩

页是一组数据,页框是主存的物理地址。 ↩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值