所以我所知道的是,x86_64上的每个虚拟地址空间都可以用48/57地址访问。所以在48位寻址中,您可以使用0-0x7FFFFFFFFFFF访问低47位(128 57 ),而使用0xFFFFFFFFFFFFFFFFFFFFFFFF访问高47位,那么57位寻址如何?处理器是用lea (Load有效地址)自动计算,还是O.S必须手动计算(特别是当将内核模式空间放在这个高128 to地址空间上时)。我想的对吗?
发布于 2022-07-25 16:13:12
CPU要求地址已经正确地扩展到64位(又称“规范”),从48位还是57位取决于控制寄存器中是否启用了5级分页。
当它们实际用于访问内存时,就会发生这种检查。lea不是这样做的,它只是对寻址模式的“偏移”部分进行移位和添加指令。lea 没有与规范地址需求( )的交互,因此对对不是地址/指针的值使用LEA?是安全的。
在更新RIP之前,分支/调用/ret/等指令中也会进行检查。如果指令试图设置一个非规范的RIP,则会在该指令上得到#GP(0)异常。相反,跳转到未映射的页面会成功,但是新地址会导致#PF页面错误。(这是有道理的;它可能不是无效的页面错误,操作系统可能只需要在某些代码中页,或者只是连接页表,如果数据已经在某处)。检测非规范地址也不需要TLB检查。
如果启用了PML5,则检查只适用于与第57位(位#56)匹配的高64-57 =7位虚拟地址。新CPU支持它,但是操作系统启用它是没有意义的,除非您的系统实际上需要那么多虚拟地址空间。(通常是因为您有大量的RAM。)页面表的额外级别减缓了每个TLB错误,更多的是由操作系统来管理。
除非您使用即将到来的AMD (上地址忽略)功能,使CPU忽略高位,或最近的Intel (线性地址掩蔽)硬件功能,使CPU只检查最重要的位(#47或#56),而不是在两者之间的位。
这些特性允许标记指针,而无需手动重做符号或零扩展名。(用户空间可以在普通的OSes上使用零扩展,因为他们知道内核不会给他们上半部分的地址。)
有关在没有LAM / UAI的情况下这样做的详细信息,请参见在64位指针中使用额外的16位。(或启用PML5的系统上的高7位。)
https://stackoverflow.com/questions/73110113
复制相似问题