保护模式

  • 全局描述符表GDT中存放着段描述符, 每个段描述符8个字节.
  • 为了跟踪全局描述符表, 处理器内部有一个48位寄存器, 叫做全局描述符表寄存器(GDTR),
  • GDTR分为两部分,分别为32位的线性地址和16的边界, 32位线性基地址部分保存的是全局描述符表在内存中的起始线性地址, 16位边界部分是全局描述符表的边界(界限), 其值等于表的大小(总字节数) - 1, 因为从偏移0开始. 如果界限值是0, 表示表的大小是1字节.
  • 因为GDT的界限是16位的, 故该表最大是2 ^ 16字节, 也就是65536字节(64KB), 又因为一个描述符8字节, 所以该表最多定义8192个描述符.
  • 在进入保护模式之后, 处理器立即要按新的内存访问模式工作, 所以, 必须在进入保护模式之前定义GDT, 但是, 由于实模式下只能访问1MB的内存, 故GDT通常多定义在1MB以下的内存范围中, 当然, 允许在进入保护模式后换个位置重新定义GDT

段描述符中, 指定了32位的段起始地址和20位的段边界,

在实模式下, 段地址并非真实的物理地址, 计算物理地址时需要左移4位.

和实模式不同, 32位保护模式下, 段地址是32位的,如果未开启分页功能, 该线性地址就是物理地址.

段基地址可以是0~4GB范围内的任意地址, 段界限用来限制段的扩展范围, 因为访问内存的方法是用段基地址加上偏移量, 所以,

对于向上扩展的段, 如代码段和数据段来说, 偏移量从0开始递增, 段界限决定了偏移量的最大值;

对于向下扩展的段,如栈段来说, 段界限决定了偏移量的最小值.

 

     在32位处理器上运行时, 每个段寄存器还包括一个不可见的部分, 称为描述符高速缓存器, 用来存放段的线性基地址,段界限和段属性,

既然不可见, 那就是处理器不希望我们访问它. 事实上, 我们也没有任何办法来访问这个不可见部分, 它是由处理器内部使用的.

当处理器在执行任何改变段选择器(段寄存去CS, DS等)的指令时(比如pop, jmp, call, ret等), 就将指令中提供的索引号(就是选择子中的索引)乘以8(一个描述符8字节)作为偏移地址, 同GDTR中提供的线性基地址相加, 以访问GDT, 如果没有发现什么问题(比如超出了GDT的界限), 就自动将找到的描述符加载到不可见的描述符高速缓存部分. 加载的部分包括段的线性基地址, 段界限和段的访问属性. 此后, 每当有访问内存时, 就不再访问GDT中的描述符, 直接用当前段寄存器描述符高速缓存器提供的线性基地址.

在保护模式下, 不允许使用mov指令改变段寄存器CS的内容, 比如: mov cs, ax, 企图这样做将导致处理器产生一个无效操作码的异常中断.

参考:https://blog.csdn.net/farmwang/article/details/52016139

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值