6

重置向量的维基百科页面说(对于 386+ 处理器):

复位时 CS 寄存器的选择器部分的值为 F000h,CS 寄存器的基数部分的值为 FFFF0000h,复位时 IP 寄存器的值为 FFF0h 形成实模式下的分段地址 FFFFF000h:FFF0h .

我所有关于计算机启动的阅读都说处理器以实模式启动,因此“选择器”不应该出现。那为什么要在这里提呢?另外,这里提到的“基本部分”是什么,它存储在哪个寄存器中?基本上,我不明白 386 处理器的复位向量与以前的处理器有何不同。

4

2 回答 2

4

需要访问的地址是内存的最后 16 个字节,因为这是存储复位向量的位置。

CS 值不同的原因是因为 8086/80186 和 80286+ 处理器之间的差异。在 80286 及以上处理器上,存在一个全局描述符表 (GDT),它指定如何在系统上访问和使用内存。8086 没有 GDT,因此内存访问基本上是固定的。 即使在 286+ 的实模式下,也存在 GDT 条目。

您引用的基数选择器值只是 GDT 条目的基数选择器部分。

因此,由于存在 GDT 条目并且在所有处理器模式下对 286+ 处理器有影响,因此重置向量设置不同。在新启动的系统上,使用以下 segment:offset 值:

8086/80186 (16-bit):             0xFFFF:0x0000
80286      (16-bit):             0xF000:0xFFF0
80386+     (32-bit):         0xFFFFF000:0xFFF0
           (64-bit): 0xFFFFFFFFFFFFF000:0xFFF0

本质上,在 80286 和更高版本的处理器上,偏移量和段值是相同的,除了段值在 32 位和 64 位处理器上进行符号扩展。

于 2014-06-14T01:13:13.190 回答
1

是的,上电后,所有 x86 CPU 都处于实模式,但在找到 CS 分配之前会出现奇怪的行为!!!。

阅读完一些 x86 文档后,这些是事实:

上电后,'CS register'、'CS cache register'和'EIP'初始值为:

CS= F000h(16 位宽,应该总是这样!)

CS_segment_start_address= FFFF_0000h(一个 32 位值,指向 RAM 中的某个位置?)。CS_segment_lenght= 0_FFFFh(一个 20 位大小的值,是的,这是 64KB)。

CS_segment 在内存中是“存在”的。

CS_segment 是一个“读/写”块。

CS_segment 已被“访问”。

EIP= 0000_FFF0h

现在,请注意以下生活事实。

==SOF==(事实开始)

当获取一条新指令(无论处于何种模式:真实、受保护等)时,硬件寻址逻辑似乎总是使用一些“CS缓存寄存器”值来确定要放置在地址总线引脚上的地址。具体来说:

Next_Instruction_Address_on_Bus= CS_segment_start_address + EIP

==EOF==(事实结束)

所以,上电后我们有这些数字:

Next_Instruction_Address_on_Bus = FFFF_0000h + 0000_FFF0h= FFFF_FFF0h

这意味着,我们是否可以在上电后访问 RAM 的最后一个角落,远离 1MB 的限制?是的!!!。神圣的格里尔!!!

但是等等,不要跑和跳!!!这只是为了(由软件开发人员)对某个代码块进行“远跳”,希望它将位于 BIOS ROM 区域中!

但是,主板确保复位向量 (0xFFFFFFF0h) 处的指令远跳转到映射到系统 BIOS 入口点 (0x0000: 0x000F0000h) 的内存位置。总之,每个“主板”都实施了这种“跳跃黑客”。[感谢 Gustavo Duarte 的解释。查看他的智能博客:http://duartes.org/gustavo/blog/post/how-computers-boot-up/]

按照上面的解释,最后提到的“远跳”是它将用表现良好的“实模式”值更新“CS_segment_start_address”:

像 CS= XYWZ h 之类的赋值(通过远“跳转”、远“呼叫”或任何其他方式完成)被翻译为:

CS_segment_star_address= 000 X_YZW 0h(其中​​ XYZW是 CS 半字节值)

4 位左移、1MB 限制、64KB 段长度 cr..p 再次恢复正常业务!

最后几句话,我想这种行为是为了确保您的加电(启动?)代码将始终位于 RAM 的最后一个角落。这样,它将为将来的操作系统处理留下大量的 RAM。[老实说,对我来说,将这个“重置”向量放在“中断向量表”@向量#0中会更有意义]。

如果我错了,请纠正我。希望这可以帮助。

PD:什么是CS缓存寄存器?嗯,它是与正在使用的 CS 选择器关联的描述符值。所有其他段也具有此“缓存寄存器”值,以便快速访问。请记住,在 x86 CPU 上,您不能随意禁用“分段”。你必须处理它。阅读一些涉及分段的“保护模式”以了解更多信息……不幸的是(或幸运的是?)分段已经过时了。分页已经成功地作为一种保护机制。

顺便说一句,一些维基百科的文章似乎是用错误的逻辑编辑的。小心它!

于 2015-09-22T15:55:29.197 回答