0

我读到了 x86 内存分段,我认为我遗漏了一些东西,线性(虚拟)地址是通过从 GDT 条目(基地址)中获取 32 位,从偏移地址中获取 32 位和将它们相加得到一个 32 位的虚拟地址。

现在,正如我所见,32 个偏移位可以跨越所有 VA 空间,因此实际上不需要使用 32 位基地址。所以我得出结论,基地址在翻译过程中并没有真正发挥作用,这让我想到使用分段的内存保护(在 x86 保护模式下)是无用的,因为我们可以获得具有环 0 权限的段的 VA与偏移地址本身。(例如,跳转 0x08000001 - 当我们的段具有环 3 特权时到内核 VA)

那么我们所有的内存保护都基于分页吗?

4

2 回答 2

0

您观察到 32 位偏移量可以跨越整个 VA 空间是正确的。但是段描述符也包含一个限制,因此使用该段的任何超出该限制的访问都将导致#GP(一般保护错误)。此外,您不能只在 ring-3 代码中使用 ring-0 段;这首先会破坏戒指等级的目的。

于 2013-06-27T15:03:42.067 回答
0

段选择器和段描述符包含关于内存段边界的数据。
描述符中不仅包含边界,还包含访问类型。

0 到 3 权限级别,越少权限越多。还有读写执行信息。所以段中每个不同的权限级别都有不同的访问权限,这是保护模式基本机制的一部分。

传统分段只是防止每个段区域的重复,否则代码段会被应用程序(或用户)的数据段或堆栈段内存污染。

最近的分段包含更确定的段选择器和段描述符的保护方法。

启动程序后,系统进入用户特权模式(3),之后您将无法访问内核特权模式(0),除非使用 rootkit 或者可能有其他方法让熟练的黑客使用。:)

于 2014-01-16T11:04:38.423 回答