我读到了关于x86内存分段的内容,我认为我遗漏了一些东西, 线性(虚拟)地址是通过从GDT条目(基址)取32位来构建的,从偏移地址取32位并将它们相加得到32位虚拟地址。
现在我看到32个偏移位可以跨越所有VA空间,因此实际上不需要使用32位基址。所以我得出结论,基地址并没有真正在翻译过程中发挥作用,这是我带来的 使用分段(在x86保护模式下)的内存保护是无用的,因为我们可以使用偏移地址本身获得具有ring 0特权的段的VA。 (EG。当我们的段具有ring 3特权时跳转0x08000001 - 到内核VA)
所以我们所有的内存保护基于分页?
答案 0 :(得分:0)
您观察到32位偏移可以跨越整个VA空间是正确的。但段描述符也包含限制,因此使用该段超出该限制的任何访问都将导致#GP(一般保护错误)。此外,您不能只在ring-3代码中使用ring-0段;这首先会破坏戒指水平的目的。
答案 1 :(得分:0)
段选择器和段描述符包含有关存储器段边界的数据 描述符中不仅包含边界,还包含访问类型。
0到3个特权级别,少有特权级别。读写执行信息。 因此,段中的每个不同权限级别都具有不同的访问权限, 它是保护模式基本机制的一部分。
旧版细分只会阻止每个细分区域的重复,否则代码段会被应用程序(或用户)的数据段或堆栈段内存污染。
最近的细分包含更多一定的保护方法,包括段选择器和段描述符。
启动过程后,系统进入用户权限模式(3),之后您无法访问内核权限模式(0),除非使用rootkit,或者对于熟练的黑客可能还有其他方法。 :)