- 论坛徽章:
- 0
|
在《自己动手写操作系统》一书上看到一段代码,从实模式跳到保护模式,再从保护模式跳回实模式。
从保护模式跳回实模式这一块不是很明白。
书中提到“在准备结束保护模式回到实模式前,需要加载一个合适的描述符选择子到有关的段寄存器,以使对应段描述符高速缓冲寄存器中案有合适的段界限和属性。”
(1)请问:实模式下还要用到描述符吗?实模式下寻址直接用CS*4+IP不就完事了吗?为什么还得使“描述符高速缓冲寄存器中案有合适的段界限和属性”?
书中还提到“不能从32位代码段返回实模式,只能从16位代码段中返回。这是因为无法实现从32为位代码段返回时CS高速缓冲寄存器中的属性符合实模式的要求(实模式不能改变段属性)”
(1)这句话又是什么意思?16位代码段返回就符合要求了??16位,32位代码段除了操作数宽度还有什么区别?
返回实模式的一段代码:
最后有一跳指令:jmp 0:LABEL_REAL_ENTRY
最开始在实模式下时,修改了这条指令,将实模式下CS的值保存在“0”的位置
; 16 位代码段. 由 32 位代码段跳入, 跳出后到实模式
[SECTION .s16code]
ALIGN 32
[BITS 16]
LABEL_SEG_CODE16:
; 跳回实模式:
mov ax, SelectorNormal
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov eax, cr0
and al, 11111110b
mov cr0, eax
LABEL_GO_BACK_TO_REAL:
jmp 0:LABEL_REAL_ENTRY;
请各位帮我解惑...
谢谢! |
|