进入保护模式
保护模式是要保护什么
全局描述符表GDT和全局描述符表寄存器GDTR
保护模式下: 对内存的访问让然使用段地址和偏移地址, 但是, 在每个段能够访问之前, 必须先进性登记
- 超出范围的访问会产生一个内部异常的中断
- 和一个段有关的信息需要八个字节(64位)来描述, 称之为段描述符, 而在内存中存放这些描述符的地方就叫做描述符表
- 全局描述符表(GDT): 顾名思义是为整个计算机硬件系统服务的, 进入保护模式之前由系统定义
- (GDTR): 描述符表寄存器(48位)
- 准备创建全局描述符表
- 寻址GDT起始地址的方法
- 从CS段主引导程序0x7c00+gdt_base获取到GDT的起始地址, 然后除以16分别讲余数和商放入dx和ax中(16位(除数) (dx高位和ax低位拼接)(被除数) ax(商) dx(余数))
;计算GDT所在的逻辑段地址
mov ax,[cs:gdt_base+0x7c00] ;低16位
mov dx,[cs:gdt_base+0x7c00+0x02] ;高16位
mov bx,16
div bx
mov ds,ax ;令DS指向该段以进行操作
mov bx,dx ;段内起始偏移地址
描述符的分类
描述符像是一个索引或者标签存储器的段描述符- 段的类型和基地址
- 每个描述符占八个字节也就是64位
- 如果S=1则当前描述符是存储器的段描述符
- 每个描述符占八个字节也就是64位
存储器的段描述符-段界限及访问控制
安装存储器的段描述符
加载全局描述符表寄存器GDTR
- lgdt指令
;初始化描述符表寄存器GDTR
mov word [cs: gdt_size+0x7c00],15 ;描述符表的界限(总字节数减一)
lgdt [cs: gdt_size+0x7c00]
开启处理器的第21跟地址线A20
通过在第21跟地址线加与门来控制输出, 在现在的CPU上已经废弃通过设置寄存器CR0的PE位进入保护模式
- 将CR0的第一个比特位置1打开保护模式的开关
描述符高速缓存器和保护模式下的内存访问
- 将段选择子传送到段选择器后处理器会到描述符表中取出指定的描述符然后将描述符的内容传送到描述符高速缓存器
- 将段选择子传送到段选择器, 将描述符中的索引号乘以8得到在描述符表中的偏移量(因为TI位是0所以是从GDT中找)加上GDTR中的线性基地址, 得到一个线性地址从GDT表中取出描述符, 然后将描述符的内容传送到描述符高速缓存器中
在调试器中观察实模式和保护模式的内存访问
- 在32位的实模式下也是使用高速缓存器保存基地址, 写入的时候会自动用偏移加上基地址去寻址
- 标题: 进入保护模式
- 作者: xiaoeryu
- 创建于 : 2022-12-11 22:40:00
- 更新于 : 2023-10-03 12:58:48
- 链接: https://github.com/xiaoeryu/2022/12/11/22-进入保护模式/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论