13

我需要修改一些 dll,但我不知道,段寄存器 ( DS, SS, ...) 在保护模式下的作用是什么。我在学校学习了真正的 16 位模式,其中段寄存器乘以 16 加上普通寄存器中的偏移量给出物理内存中的有效地址。在保护模式下,有一些平面内存模型和虚拟内存,其中每个进程“拥有”4GB 内存,所以如果寄存器有 32 位,那么我只能通过“偏移”寄存器来寻址虚拟内存的每个字节。那么哪些 puproses 在保护模式下具有段寄存器,例如

mov eax, dword ptr ds:[20037DA0] 
4

3 回答 3

10

一些历史背景

8086 总是使用每个段的固定 64KiB 窗口,其起始地址由(段寄存器 * 16)计算。由于 80286 内存中有一些特殊的表(GDT 和 LDT)。这些表包含段的起始地址、长度和访问权限。段寄存器(CS、DS、ES、SS - 以及自 80386 起:FS、GS)包含这些表的索引。

所以理论上操作系统可能会以它想要的方式设置段的偏移量和长度:在 8086 上 DS=0x0123 意味着:段是从地址 0x01230 开始的 64KiB。在 32 位模式下,DS=0x0123 可能意味着:段从地址 0xABCD 开始,长度为 0xEF 字节 - 这取决于操作系统创建的 GDT 和 LDT 表的内容。尝试访问此范围之外的段(如果长度 < 0x1000,则为 DS:0x1000)将导致异常(中断)。

现在的情况

然而,大多数现代 32 位操作系统不再真正使用段寄存器。由于访问权限问题,它们的值是根据模式(内核或用户)设置的。起始地址通常为 0,长度为 4GiB。

实际内存保护是使用 MMU 完成的,因此在用户模式下无法访问某些内存区域。在现代操作系统中,MMU 绝对是必不可少的。它将“绝对”虚拟地址映射到真实物理地址,检查访问权限是否违反。

有一个例外:一些操作系统(例如 Windows 和 Linux)使用 FS 和/或 GS 段来真正指向不同的内存区域。

因此,在 64 位模式下,x86 处理器仅将 CS 寄存器用于访问权限问题,而 FS 和 GS 可用于为每个地址添加偏移量。据我所知,不使用 DS、ES 和 SS,而寄存器 FS 和 GS 的内容无关紧要,但是有一些特殊的寄存器明确给出了要添加到使用 FS 或 GS​​ 的操作的偏移量。

于 2013-11-11T10:50:12.013 回答
9

基本上目的与实模式相同,只是它们的工作方式略有不同。您的示例中的 DS 在您的 GDT 中选择一个内存描述符(如果您真的想了解这一点,请谷歌这个术语,“全局描述符表”),其中包含基地址、结束地址、粒度等信息。然后将您的偏移量添加到基地址, 结束。如果您在 Windows 上(我打赌在 linux 上也一样),您通常不必担心这些段寄存器,正如您所说的它的平面模型,这意味着所有内存应该只有一个描述符,所以如果你不改变这些寄存器应该像它们甚至不存在一样工作。

于 2013-03-11T10:19:31.443 回答
1

我会给你一个简单的答案,但要了解更多信息,我推荐下面的链接到 AMD 的架构文档,非常容易阅读。PS:我没有在这里介绍 Xeon 或 PAE ..

IA-32 (x86) 架构具有用于 RAM 的 32 位物理地址总线。

32 位总线进一步分为 2 个 16 位段,每个段能够访问 2GB 的 RAM,总共 4GB。
这称为存储库切换。

为了提供保护,Intel 和 MS 决定将一个段用于内核模式,另一个用于用户模式——这就是 Windows 历史上拥有 2GB 用户模式地址空间的原因。这是 x86 硬件限制,而不是 Windows 限制。

段寄存器分隔内核空间和用户空间地址。这就是内存保护的实现方式。

此外,IA-32 通用也有 32 位内部寄存器,所以它不能分页。这是实模式(无地址转换)。

分页需要 36 位我认为(不要引用我的话)这就是 IA32e 的用武之地。IA-32e 上的额外位允许从 HDD 分页,这是它可以在 x64 Windows 上运行的唯一方式,因为 x64 需要 NX,它位于位 63。

请阅读 AMD 架构文档,我个人觉得它们比 Intel 版本提供更多信息。

http://developer.amd.com/wordpress/media/2012/10/24593_APM_v21.pdf

引入了带有 AMD64 平面内存的 PS,取消了分段。

但是 32 位进程仍然需要段寄存器。在 AMD64 上,当 32 位进程到达栈顶时,会抛出一个指向新段寄存器的基地址的指针。这样 32 位应用程序可以有效地消耗尽可能多的 RAM,没有限制。在合理的范围内... :)

希望这可以帮助。

于 2017-08-03T13:41:36.453 回答