x86-64 4kb page翻译设计:这是这个原因为4096字节对齐的原因?

2021-06-22 16:43:33

我丢失了3周的我的生命,试图在英特尔X86-64 / AMD64手册上包装我的头,以尝试为我的爱好者操作4-KBETE页面翻译。这个小博客文章的目的是记录手册中的一些东西并不清楚。 (特别是新人)

您已经看到了大约十亿次的照片,如果您正在阅读此帖,您知道您需要在内存中创建这些页面表,以便硬件与操作系统建立一个明确定义的接口,以便在移动到64之前分配小块的小块-bit模式。

在引导过程的早期阶段期间,我想要为前10MB内存创建Identity映射页面的图像。在移动到长模式(64位)之前,这将是在内存存储器中加载内核的有用。

对我们为什么这样做的解释是由于预期的4-Kbyte PDE条目格式

但如果你仔细看,你会发现一些非常奇怪的东西。我们被导致认为页面表基地地址(0x13000)应根据上图的图片在比特51:12之间设置。

如果该假设是正确的,则0x13000应左移12位并变为0x13000000。因此,在设置页面标志之后,它将变为0x13000003。这意味着您之前共享的代码片段是错误的,是对的吗?

如果你想花3周试图弄清楚你为什么没有启动的时候,那么在质疑你的情况下你的每一职业决定都没有启动

思想的火车不是错误的,但X86-64设计有点不同于我们推测的东西。

页面数据结构表始终在4-kbyte边界上对齐,因此只有上述位11的地址位存储在翻译表基地址字段中。假设位11:0为0.(取自AMD64手册,第150页)

这意味着在实践中是什么,如果我们的页面在地址0x13000上,标志位是0x03 = 0x13003,我们的硬件“重新利用”12位以在当前页面地址添加0x1000时设置标志,它可以到达下一页。如果单独的是单独的,这是难以推测的是Page Tables是4096字节的整个原因(或0x1000😜)

问题是,虽然这是在手册中编写的,但没有强调在一个手册中间的稀疏句子,千页😫

好吧,我花了很长时间才能达到这个,我相信一天我会忘记我的名字,但不会忘记这场与x86-64分页的战斗。

我希望如果有人在努力与我可以减少那个时间的同样的问题,那就花了你来解决这个问题。 ❤️