mov ax,#0x0001 ! protected mode (PE) bit
lmsw ax ! This is it!
lmsw加载机器状态字(对应CR0寄存器位15-0),即CR0低16位状态为
其它位(15位) | 启用保护标志PE |
0 | 1 |
jmpi 0,8 ! jmp offset 0 of segment 8 (cs)
跳转的逻辑地址为
段选择符(16位) | 偏移量(32位) |
8 | 0 |
其中段选择符
描述符索引(13位) | 表指示标示TI(1位) | 请求特权级RPL(2位) |
0000000000001 | 0 | 00 |
表示请求特权级0(内核级),使用全局描述符表GDT中第1个段描述符项,该项找出代码的基地址是0。跳转前全局描述符表设置为如下(红色部分为选取的描述符项,共64位)
gdt:
.word 0,0,0,0 ! dummy
.word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
.word 0x0000 ! base address=0
.word 0x9A00 ! code read/exec
.word 0x00C0 ! granularity=4096, 386
.word 0x07FF ! 8Mb - limit=2047 (2048*4096=8Mb)
.word 0x0000 ! base address=0
.word 0x9200 ! data read/write
.word 0x00C0 ! granularity=4096, 386
全局描述表GDT的地址是通过GDTR寄存器得到的,在跳转指令执行之前已通过指令
lgdt gdt_48 ! load gdt with whatever appropriate
设置好了,指令中gdt_48为
gdt_48:
.word 0x800 ! gdt limit=2048, 256 GDT entries
.word 512+gdt,0x9 ! gdt base = 0X9xxxx
即GDTR寄存器为
32位线性基地址 | 16位表长度 |
0x90200 + gdt | 0x800 |