理解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),即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
- 理解0.11内核setup.s中实模式与保护模式的切换
- 保护模式与实模式的切换
- 实模式与保护模式切换
- 保护模式及其编程——实模式与保护模式的切换
- 保护模式及其编程——实模式与保护模式的切换
- 保护模式及其编程——实模式与保护模式的切换
- 实模式->保护模式->实模式 的切换步骤
- 实模式、保护模式的区别 实模式保护模式切换方法
- 80x86保护模式系列教程(4)实模式与保护模式切换实例
- 内核基础 - 实模式与保护模式下的寄存器&计算机的启动过程(by quqi99)
- 实模式切换到保护模式
- DG保护模式切换中遇到的ORA-16072错误
- DG保护模式切换中遇到的ORA-16072错误
- setup.bin进入保护模式
- 实模式与保护模式
- 实模式与保护模式
- 实模式与保护模式
- 实模式与保护模式
- 游戏设计
- 读风中叶的《我的漫漫程序人生路》笔记
- 什么是强类型语言和弱类型语言
- 雨落秋界
- 关于大学,关于未来(一个迷茫的大专生的心里话)
- 理解0.11内核setup.s中实模式与保护模式的切换
- 剧本改写底稿
- 加油
- 关于内存对齐以及通过偏移获得结构地址
- 急需
- 抓住终极目标 (9月20日)
- UML图中类图和对象图的关系
- uCOS II堆栈设计思想
- 求数组中的最大值