重置386+处理器中的向量

时间:2014-05-02 07:03:04

标签: x86 boot real-mode

Reset vector的维基百科页面(适用于386多个处理器):

  

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

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

1 个答案:

答案 0 :(得分:1)

是的,上电后,所有x86 CPU都处于实模式 奇怪的行为 ,直到找到CS分配为止! !!。

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

上电后,CS寄存器' CS缓存寄存器'和' 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; 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的限制?是!!!。神圣的grial !!!。

但是等等,不要跑,跳!这只是为了(由软件开发人员)提供一个“远程跳跃”。希望它能够位于BIOS ROM区域的一些代码块。

然而, 主板 确保复位向量(0xFFFFFFF0h)处的指令是远跳到内存位置映射到系统BIOS入口点(0x0000:0x000F0000h)。总之,每个主板'实施了这个'跳跃黑客'。 [Thanx 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。 [老实说,对我来说,放置这个'重置'更有意义。 “中断向量表”中的向量' @ vector#0]。

如果我错了,请纠正我。希望这会有所帮助。

PD:什么是CS缓存寄存器?好吧,它是与使用中的CS选择器关联的描述符值。所有其他段都有此缓存寄存器'值也可以快速访问。请记住,在x86 CPU上,您无法禁用'细分'随意。你必须处理它。阅读一些“保护模式”'涉及细分以了解更多...不幸的是(或者幸运的是)分段已经过时而且过时了。寻呼已成为一种保护机制。

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