【发布时间】:2018-01-21 18:10:08
【问题描述】:
我正在尽我所能了解OSDEV tutorial 的内容。我已按照建议阅读了 AMD64 程序员手册(第 2 卷)第 4 章和第 5 章,但我不明白当他经历这个循环时会发生什么:
mov ebx, 0x00000003 ; Set the B-register to 0x00000003.
mov ecx, 512 ; Set the C-register to 512.
.SetEntry:
mov DWORD [edi], ebx ; Set the uint32_t at the destination index to the B-register.
add ebx, 0x1000 ; Add 0x1000 to the B-register.
add edi, 8 ; Add eight to the destination index.
loop .SetEntry ; Set the next entry.
我明白他为什么将 ebx 设置为 3,但除此之外,我看不出他对 ID 映射 2 MB 做了什么。
【问题讨论】:
-
此时代码中的 EDI 指向位于内存地址 0x4000 的页表。有 512 个页表条目,每个条目代表 4kb,总共需要初始化 2mb (512*4096)。循环通过每次迭代添加 0x1000(4096=4kb) 来设置物理地址页。它有效地将此页表 (PT) 映射到物理内存的前 2mb。
-
好的,谢谢。不知道为什么我无法解决这个问题。你会说这是在内核处理之前设置分页的好方法吗?
-
如果你打算标识映射前 2mb 的内存没有问题。如果您不打算在启用分页后保留身份映射,则可以考虑使用 2MB paging rather than 4kb which is a feature of PAE 。这简化了事情,因为您只需要一个页面目录指针表和一个页面目录。不需要循环。它也可以很容易地被取消映射和失效。 2mb 分页对于很多用途来说可能不够小,但更方便地临时标识映射前 2mb。
-
我上一条关于 2mb 分页和 PAE 分页结构的评论适用于您处于 32 位保护模式时。
-
该教程有什么原因会导致我犯三重错误吗?我的代码一直有效,直到我尝试切换到长模式。如果不是,我会犯什么错?
标签: memory mapping virtual paging osdev