我读到了x86内存分段,我想我遗漏了一些东西,线性(虚拟)地址是通过从GDT条目(基地址)中获取32位,从偏移地址中获取32位,并将它们相加得到32位虚拟地址来构建的。
现在,在我看来,32位的偏移量可以跨越所有的VA空间,所以实际上不需要使用32位的基址。因此,我得出结论,基址在转换过程中并没有真正发挥作用,这让我得出这样的结论:使用分段的内存保护(在x86保护模式下)是无用的,因为我们可以使用偏移地址本身获得具有环0特权的段的VA。(例如,跳转0x08000001 -当我们的段具有环3特权时,跳转到内核VA )
所以我们得到的所有内存保护都是基于分页的?
发布于 2013-06-27 23:03:42
您所观察到的32位偏移量可以跨越整个VA空间的观点是正确的。但段描述符也包括限制,因此任何超过该限制的访问使用该段将导致#GP (一般保护错误)。此外,您不能只在ring-3代码中使用ring-0段;这将首先违背ring级别的目的。
发布于 2014-01-16 19:04:38
段选择器和段描述符包含关于存储器段边界的数据。
描述符中不仅包含了边界,还包含了访问类型。
0到3的特权级别,越少特权越大。还有读-写-执行信息。因此,段中不同的权限级别具有不同的访问权限,是保护模式基本机制的一部分。
传统分段只是防止每个段区域的重复,否则代码段会被应用程序(或用户)的数据段或堆栈段内存污染。
最近的分段包含了更多的带有分段选择符和分段描述符的保护方法。
在启动程序之后,系统进入用户特权模式(3),然后你不能访问内核特权模式(0),除非使用rootkit,或者可能有其他方法供熟练的黑客使用。:)
https://stackoverflow.com/questions/17017971
复制相似问题