我想总结一下这个社区wiki帖子中的评论,结合我目前的理解。如果您开始从抽象的角度了解页表和翻译后备缓冲区,您可能需要阅读此内容。但是,这篇文章可能无法保证位和字节的 100% 正确性。
启动电脑
i386 PC 以实模式启动。此模式仅使用物理内存,还不关心虚拟内存。所有指令都以高权限执行。我们可以将其视为处于内核模式。
操作系统(不管是 Linux 还是 Windows 都无所谓)在这种模式下执行。它将建立页表,然后将 CPU 切换到保护模式。
; set PE bit
mov eax, cr0
or eax, 1
mov cr0, eax
; far jump (cs = selector of code segment)
jmp cs:@pm
@pm:
; Now we are in protected mode.
用于写入页表的操作码
页表驻留在物理内存中,永远不会交换到磁盘。因为页表不在翻译后备缓冲区中,所以我们可以使用简单的内存写指令mov
来填充页表。不需要特定的汇编指令来设置页表。
翻译后备缓冲区
翻译后备缓冲区只是页表的缓存。为了不将其与“普通”缓存混淆,它位于 CPU 的不同部分。
如果操作系统写入页表(在 RAM 中,而不是在缓存中),每个 CPU 上至少需要有一条特定的汇编指令:用于清除 TLB,以便 CPU 重新读取页表记忆。
清除整个 TLB 可能会浪费性能,因为只能将单个页面交换到磁盘。因此,i486 汇编器指令invlpg
仅使单个页面无效。
是否有特权 TLB 操作码?
清除 TLB 对应用程序似乎不是很重要。即使可以在用户模式下执行指令,CPU 也只会再次读取原始页表。但是,因为只有内核才能写入页表,所以清除 TLB 的汇编指令是高权限指令听起来是个好主意。
TLB的初始内容
最初的内容并不重要。操作系统将设置页表,然后