【发布时间】:2014-03-20 02:19:53
【问题描述】:
应用程序使用虚拟内存。这是一个不错的概念,我们可以将它视为一个连续的块,而不必关心它是否在物理 RAM 中是连续的,甚至是否在硬盘上。
据我所知,虚拟地址和物理地址之间的映射是由 CPU(或至少在硬件中)使用转换后备缓冲区直接完成的。
我假设内核以某种方式维护了 TLB 的内容,但在这里我有点卡住了,所以我有 3 个问题:
查询、读取和写入 TLB 内容的具体汇编指令是什么? 我在谷歌上搜索与此主题相关的操作码并不是很幸运。我刚刚找到了 INVLPG 和 TLBWI。因为我对这种深度不熟悉,所以也许我只是使用了错误的搜索词。如果您立即找到它,您会使用哪些搜索词?
所有这些汇编指令都需要特权 CPU 模式吗?
TLB的初始内容是什么?如果TLB一开始是空的,是否意味着操作系统的第一条汇编指令将直接映射到物理内存(这样虚拟地址 == 物理地址)?
【问题讨论】:
-
TLB(我认为)只是页表的缓存——一种驻留在指定所有映射的主物理内存中的结构。 TLB 仅在内核进行更改时才需要失效(我认为,再次)。
-
不知道TLB的内容,但是x86机器都在real mode启动
-
@Linuxios:这可以解释为什么它被称为缓冲区。如果物理 RAM 中的实际页表从不交换,那也很容易理解。
-
@ArjunShankar:天哪!在 DOS 中摆弄这些东西 20 年后(不知道我实际上做了什么),我终于回来尝试在汇编程序级别上理解它......感谢您的评论 - 它提供了一个很棒的突触连接。
-
检查wiki.osdev.org/Paging#Page_Table;这包含填写表格和打开分页的所有详细信息。基本上它只是一堆 32 位条目,其在物理内存中的基数由寄存器 cr3 设置。