主要内容
1.实现从保护模式跳回实模式
2.LDT
3.对保护模式下特权级的简单介绍
一
在从保护模式跳转到实模式前要保证对应的段描述符寄存器有合适的段界限和属性,需要加载一个选择子到段寄存器。此外保护模式为32位环境,实模式为16位环境,需要从16位代码段返回`
1.加载选择子(新建Normal,添加在GDT中)
LABEL_DESC_NORMAL: Descriptor 0, 0ffffh, DA_DRW ; Normal 描述符
SelectorNormal equ LABEL_DESC_NORMAL - LABEL_GDT
2.准备返回的16位代码段
; 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 ; 段地址会在程序开始处被设置成正确的值
Code16Len equ $ - LABEL_SEG_CODE16
; END of [SECTION .s16code]
完成对应寄存器的赋值,改变cr0的PE位。
其中最后的跳转需要联系到程序开始处
LABEL_BEGIN:
mov ax, cs
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0100h
mov [LABEL