嗨,我的问题很简单: 如果您有 4 字节指令并且您的操作系统使用分页。是否有可能进行多次地址转换来获取这个 4 字节指令?
我搜索了 de ostep 课程书籍,但找不到说明。 预先感谢。
具有固定宽度 4 字节指令的传统 ISA,例如 MIPS,要求它们自然对齐(按 4 对齐,低 2 个地址位 = 0),因此它们不能跨越任何更大的幂次方2 对齐边界,例如页面。
但是有很多具有可变长度指令的 ISA,其中一条指令可以跨越页面边界,因此对于虚拟内存,需要两种不同的 virt->phys 转换。 (通常 CPU 会将 16 字节等块提取到缓冲区或队列中,然后从中进行解码,但是,作为提取一条指令的字节的一部分,您仍然需要进行两次地址转换)。
参见 x86 指令是否需要它们自己的编码以及它们的所有参数同时存在于内存中?,其中讨论了一次可能出现的最坏情况下的页面数,包括跨越页边界的指令。
您还可以考虑像
MIPS lw $t0, 0($t1)
这样的页面错误情况,然后在操作系统的页面错误处理程序修复情况并返回到用户空间后,重新获取指令,需要另一个地址转换。
所以这算作 2 次获取。如果有大量任务正在运行(并且操作系统上下文在页面错误期间切换到其他任务),则在该任务再次运行并返回到用户空间进行代码获取或数据加载之前,代码或数据甚至可能会再次被逐出又犯错了。因此,对于一次“成功”执行,地址转换的数量理论上是无限的。 但每次获取仍然只有 1 个翻译。 (或者 2 表示分页说明。)