operating-system - 为什么将页面大小指定为指令集体系结构的一部分?

标签 operating-system cpu-architecture virtual-memory instruction-set page-tables

我想了解为什么将页面大小指定为 ISA 的一部分。

更具体地说,我正在寻找任何硬件模块(MMU、TLB)(操作系统除外)使用页面大小信息来提供特定功能的详细信息。

请告诉我为什么页面大小必须成为 ISA 的一部分,而不仅仅是由操作系统决定。

谢谢。

最佳答案

TLB 硬件必须知道页面大小才能确定转换是否适用于地址。例如给定一个翻译,它上面 2500 字节的地址是否使用该翻译?

或者换句话说,TLB 必须知道哪些地址位是页面偏移量的一部分(在页面内),以及哪些位需要从虚拟转换为物理。

此外,在具有硬件页面遍历的架构上,整个页表格式是 ISA 的一部分,典型的设计使用虚拟页码作为索引来找到正确的条目(例如 x86-64's 4-level page tables )。 不是通过页表进行线性或二进制搜索以查找包含要搜索的虚拟地址的条目。通常,这种相同的设计用于由软件 AFAIK 遍历的页表。


It is possible to build a TLB where each entry has a mask to control how many address bits it matches .即单个 TLB 可以包含多个大小页面的条目。这仅在页面具有 2 的幂大小并且自然对齐时有效(即页面的起始地址始终是其大小的某个倍数,因此将页面内地址的低位归零将为您提供页面起始地址).

您可以将其与 extent-based 一起使用页表格式,其中每个连续映射都有一个条目,而不是每个页面都有一个条目。

页面遍历可能会更昂贵,必须检查更多条目以获得更多映射,但相同数量的 TLB 条目可以覆盖更多地址空间。

在许多情况下,操作系统希望能够轻松取消映射甚至分页未使用的页面,这与使用包含冷热数据或代码混合的大页面相冲突。 (但是普通的固定大小的大页面也有这个问题,所以 x86-64 的 2M 和 1G 大页面与标准的 4k 页面相比并不总是胜出。)

关于operating-system - 为什么将页面大小指定为指令集体系结构的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46506534/

相关文章:

c - 与单进程场景​​相比,多进程场景中的访问时间意外减少

assembly - 内核如何决定在 MESI 中使哪个缓存行无效?

linux - 我可以保护两个进程之间的内存吗

c - 从另一个应用程序访问(读/写)虚拟内存进程

c++ - 为什么 sleep() 会导致换行?

python - 从零开始的操作系统

c++ - 为什么 Windows 在我使用 ** 时将我的目录列表注入(inject)到 argv 中?

c++ - 在 DLL 注入(inject)中访问内存会导致内存访问冲突

c - 64位机器中的对齐不是8字节

linux - Linux 上环形缓冲区的内存镜像