n 1 k z z z Asked:2022-06-30 19:20:16 +0000 UTC2022-06-30 19:20:16 +0000 UTC 2022-06-30 19:20:16 +0000 UTC 分页中的数据、代码和堆段 772 以 Windows 为例。我知道这个操作系统使用分页内存。但是数据段、代码段、堆段等概念,仍然适用于在这个OS下运行的程序,是这样吗?我是否正确理解这些不是x86 机器上的段?那么如何对它们进行寻址呢? виртуальная-память 1 个回答 Voted Best Answer PRODIGY 2022-07-01T04:53:03Z2022-07-01T04:53:03Z 即使处理器在传统模式下运行,它也不使用分段,对吗?那么这些细分市场会发生什么? 操作系统在这里无关紧要,当从真实模式切换到保护模式时,处理器本身在硬件级别支持算法。在这种情况下(通常)一个寻呼组织叠加在分段组织上。 处理器有 6 个段寄存器:CS\DS\SS\ES\FS\GS(代码、数据、堆栈、扩展和另外两个)。因此,没有堆段。 这些寄存器大小为 10 字节,每个都存储两个组件:一个 2 字节的可见“选择器”和一个 8 字节的隐藏“句柄”。选择器有一个 2 位的“RPL”(请求特权级别)字段,其中包含保护环编号 0-3。如果代码在内核模式下执行,则 RPL=0,如果在用户下,则 RPL=3。 描述符描述了内存段本身。在主要描述符字段中,可以区分“Base”(始终为零)、“Limit”(始终最大 4 GB)、各种属性和 4 位“Type”字段。段的类型存储在这个字段中,可以是代码(可用于执行),也可以是数据。堆栈段是相同的数据段,只是设置了“Expand-Down”位(反向扩展)。在 Intel docks 卷 (3) 中有截图: 这是 4 位“类型”字段的解码(堆栈段的位以红色突出显示): 系统有一个 GDT(全局描述符表)表,其中存储了所有六个段的描述符。汇编指令SGDT读取这个表(Store)并向其中LGDT写入新值(Load)。
操作系统在这里无关紧要,当从真实模式切换到保护模式时,处理器本身在硬件级别支持算法。在这种情况下(通常)一个寻呼组织叠加在分段组织上。
处理器有 6 个段寄存器:CS\DS\SS\ES\FS\GS(代码、数据、堆栈、扩展和另外两个)。因此,没有堆段。
这些寄存器大小为 10 字节,每个都存储两个组件:一个 2 字节的可见“选择器”和一个 8 字节的隐藏“句柄”。选择器有一个 2 位的“RPL”(请求特权级别)字段,其中包含保护环编号 0-3。如果代码在内核模式下执行,则 RPL=0,如果在用户下,则 RPL=3。
描述符描述了内存段本身。在主要描述符字段中,可以区分“Base”(始终为零)、“Limit”(始终最大 4 GB)、各种属性和 4 位“Type”字段。段的类型存储在这个字段中,可以是代码(可用于执行),也可以是数据。堆栈段是相同的数据段,只是设置了“Expand-Down”位(反向扩展)。在 Intel docks 卷 (3) 中有截图:
这是 4 位“类型”字段的解码(堆栈段的位以红色突出显示):
系统有一个 GDT(全局描述符表)表,其中存储了所有六个段的描述符。汇编指令
SGDT读取这个表(Store)并向其中LGDT写入新值(Load)。