理解0.11内核setup.s中实模式与保护模式的切换

来源:互联网 发布:09年加索尔总决赛数据 编辑:程序博客网 时间:2024/05/17 23:37

mov ax,#0x0001 ! protected mode (PE) bit

lmsw   ax     ! This is it!

lmsw加载机器状态字(对应CR0寄存器位15-0),即CR016位状态为

其它位(15位)

启用保护标志PE

0

1

jmpi   0,8    ! jmp offset 0 of segment 8 (cs)

跳转的逻辑地址为

段选择符(16位)

偏移量(32位)

8

0

其中段选择符

描述符索引(13位)

表指示标示TI1位)

请求特权级RPL2位)

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