【译】x86程序员手册38-10.2实在址模式下的软件初始化
10.2 Software Initialization for Real-Address Mode
实地址模式的软件初始化
In real-address mode a few structures must be initialized before a program can take advantage of all the features available in this mode.
在实地址模式,程序在能利用这个模式下的的所有可用特性之前,新架构必须被初始化。
10.2.1 Stack 栈
No instructions that use the stack can be used until the stack-segment register (SS) has been loaded. SS must point to an area in RAM.
在栈段寄存器(SS)被装入前,使用栈的指令都不能用。SS必须指向RAM的一块区域。
10.2.2 Interrupt Table 中断表
The initial state of the 80386 leaves interrupts disabled; however, the processor will still attempt to access the interrupt table if an exception or nonmaskable interrupt (NMI) occurs. Initialization software should take one of the following actions:
80386的初始化状态中,中断是关的;然而,如果异常或非屏中断(NMI)发生,处理器仍将试图访问中断表。初始化软件应当采取下列的动作之一:
- Change the limit value in the IDTR to zero. This will cause a shutdown if an exception or nonmaskable interrupt occurs. (Refer to the 80386 Hardware Reference Manual to see how shutdown is signalled externally.)
修改IDTR的限长值为0。这样,当异常或非屏蔽中断的发生时,将关机。(参见80386硬件参考手册,如何使用外部信号关机。)
- Put pointers to valid interrupt handlers in all positions of the interrupt table that might be used by exceptions or interrupts.
在中断表的所有位置都放置一个有效的中断处理程序的指针,用来处理异常或中断。
- Change the IDTR to point to a valid interrupt table.
修改IDTR以指向一个中断表。
10.2.3 First Instructions 第一条指令
After RESET, address lines A{31-20} are automatically asserted for instruction fetches. This fact, together with the initial values of CS:IP, causes instruction execution to begin at physical address FFFFFFF0H. Near (intrasegment) forms of control transfer instructions may be used to pass control to other addresses in the upper 64K bytes of the address space. The first far (intersegment) JMP or CALL instruction causes A{31-20} to drop low, and the 80386 continues executing instructions in the lower one megabyte of physical memory. This automatic assertion of address lines A{31-20} allows systems designers to use a ROM at the high end of the address space to initialize the system.
在REST之后,地址线A{31-20}被自动使用(asserted,一般而言assert都是查看位是否为1,所以这里应该是指高12位自动变成1。)来取指令。这个事实,与CS:IP的初始化值一起,导致指令执行在物理地址FFFFFFF0H处(译注:CS此时是0,而IP为FFF0H)。近(段内)控制转移指令可以用来传递控制到地址空间的高端64K中的另一个地址。第一条远(段间)JMP或CALL指令会导致线性地址A{31-20}丢掉低端,80386继续执行指令在低端1M的物理内存中。这种地址线自动验证A{31-20}就允许系统设计者使用位于地址空间高端的部分ROM来初始化系统。
(这部分是真的看不懂,所以基本不要相信我翻译的,大致就是说,在实地址模式下,虽然可以用32位来表示地址,但实际上地址高端部分是要被丢弃掉的,所以实际上在实地址模式下,能做的寻址就是1M以下。而本人理解的是,BIOS此时就是在这样环境下运行的,所以BIOS不能使用1M以上的地址,但具本人跟踪BIOS代码来看,BIOS代码至少有部分代码是工作在保护模式下的,只是在BIOS运行结束后又将机器重置回实地址模式了。)