IA-32体系结构CPU保护模式常见误区

系统软件开发系列文章之一:IA-32体系结构CPU保护模式常见误区

 

20100603随笔版,不保证完全的学术严谨)

 

立志于成为系统程序员的同学们,或者尝试操作系统开发的程序员们,在阅读IA-32体系结构(以下简称80386)保护模式相关资料时,常常被一些表述不清晰,甚至可能存在理解错误的资料所误导。笔者简单总结了80386保护模式中的一些常见误区,这些误区曾经被国内的一些教材反复引用,在此列出,以供学习者参考。

 

180386保护模式下的段寄存器是16位的

 

错误!实际上无论实模式还是保护模式,80386的段寄存器都是80位,但只有16位是可见的,也就是说,程序员只能访问80位段寄存器中的16位。

 

段寄存器中64位的不可见部分,一般资料称之为“描述符高速缓存寄存器”或者“影子寄存器”,这一部分是真正控制80386 CPU内部硬件电路寻址的寄存器,其内容就是一个描述符。

 

保护模式下,当修改段寄存器中16位的可见部分(也就是程序员访问的CSDSSSESFSGS)时,80386认为这16位可见部分是一个段选择子(Selector),于是根据选择子中的索引,在GDT或者LDT中定位对应的描述符,检查保护模式段保护规则(特权级)没有被违反后,将对应的描述符装载到段寄存器不可见部分中,80386 CPU内部硬件电路即根据段寄存器不可见部分中的描述符对应的基址和限长进行线性地址寻址。

 

实模式下,段寄存器64位不可见部分的内容仍然是一个描述符(自动生成的16位段描述符),对应的限长是64KB,基址是段寄存器16位可见部分左移4位,当16位可见部分发生改变时,自动生成新的基址,并自动更新64位不可见部分中的描述符。80386 CPU内部硬件电路还是根据段寄存器不可见部分中的描述符对应的基址和限长进行寻址。

 

可以看出,无论是实模式还是保护模式,实际寻址都是由段寄存器64位不可见部分决定的,实模式和保护模式的区别只在于生成段寄存器64位不可见部分中的描述符的方式不同。

 

需要特别注意的一点是:如果不改变段寄存器16位可见部分,也就是程序员不修改CSDSSSESFS或者GS,那么64位不可见部分的内容就不会被重新装载或者更新,即使发生了实模式和保护模式之间的切换也是一样。

 

2、修改CR0寄存器中的PE位之后需要执行一条远跳转指令才能进入保护模式

 

错误!只要将CR0寄存器中的PE位设置为180386就已经进入了保护模式,但是如果没有修改CS的内容,则对应的64位不可见部分中的内容还是实模式下自动生成的描述符,并没有自动从GDT或者LDT中装载新的描述符,内存指令寻址方式并没有发生变化。这一点是必需的,否则如果80386一旦进入保护模式就自动装载新的描述符,则内存指令寻址方式立即发生变化,对紧随进入保护模式指令之后的后续指令,就无法正确从内存中取指令并执行。

 

进入保护模式之后的远跳转指令的作用,实际上就是更新CS的内容,由于此时已经进入保护模式,才会自动从GDT或者LDT中装载新的描述符到CS对应的64位不可见部分中,这样描述符指定的保护模式分段寻址方式才被真正启用。

 

换句话说,将CR0寄存器中的PE位设置为1可以让80386进入保护模式,但只有通过远跳转指令等方法修改了CS的内容,才能启用GDT或者LDT中描述符指定的保护模式分段寻址方式。

 

3、实模式下一定不能访问4GB内存

 

错误!先进入保护模式,在保护模式下,选择一个实模式操作系统(例如DOS)下通常不被使用的附加数据段寄存器(例如FS),修改其内容(16位可见部分内容),使其定位到GDT或者LDT中一个基址为0,限长为4GB的数据段描述符,这样描述符被自动装载到FS对应的64位不可见部分中,随后退回到实模式,只要不更新FS的内容,64位不可见部分中的内容仍然是基址为0,限长为4GB的数据段描述符,这样通过FS和对应32位偏移量就能访问到4GB内存。

 

早年讲述DOS高级编程的一些书籍上都介绍过“实模式下访问4GB内存”的方法,其方法原理正是如此。

 

4、段保护的实质是什么?

 

在保护模式分段寻址方式下,真正控制80386 CPU硬件电路寻址的是段寄存器64位不可见部分中的描述符,因此只要阻止违反段保护规则的描述符被装载到段寄存器64位不可见部分中,即可实现段保护。80386 CPU是不可能在从内存中取每一条指令,或者读写每一个字节数据时都进行特权级检查的,这样会严重降低CPU的效率。

 

这也是为什么段寄存器有64位不可见部分的原因,因为这一部分只能在不违反段保护规则的情况下更新,不能由程序员自由修改,因此对程序员不可见。

 

除某些特殊情况(例如通过调用门进行的调用)之外,段保护的一般规则是:

 

CPL:当前特权级

RPL:请求特权级(准备更新段寄存器16位可见部分的选择子确定的特权级)

DPL:描述符特权级(准备装载到段寄存器64位不可见部分中的描述符确定的特权级)

 

则要求CPLRPL都不低于DPL(如果进行特权级数字的比较,应该是不大于),即(CPL<=DPL)&&(RPL<=DPL)

 

 

相关推荐
<p> <span style="font-size:14px;color:#E53333;">限时福利1:</span><span style="font-size:14px;">购课进答疑群专享柳峰(刘运强)老师答疑服务</span> </p> <p> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;"></span> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>为什么需要掌握高性能的MySQL实战?</strong></span> </p> <p> <span><span style="font-size:14px;"><br /> </span></span> <span style="font-size:14px;">由于互联网产品用户量大、高并发请求场景多,因此对MySQL的性能、可用性、扩展性都提出了很高的要求。使用MySQL解决大量数据以及高并发请求已经是程序员的必备技能,也是衡量一个程序员能力和薪资的标准之一。</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;">为了让大家快速系统了解高性能MySQL核心知识全貌,我为你总结了</span><span style="font-size:14px;">「高性能 MySQL 知识框架图」</span><span style="font-size:14px;">,帮你梳理学习重点,建议收藏!</span> </p> <p> <br /> </p> <p> <img alt="" src="https://img-bss.csdnimg.cn/202006031401338860.png" /> </p> <p> <br /> </p> <p> <span style="font-size:14px;color:#337FE5;"><strong>【课程设计】</strong></span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;">课程分为四大篇章,将为你建立完整的 MySQL 知识体系,同时将重点讲解 MySQL 底层运行原理、数据库的性能调优、高并发、海量业务处理、面试解析等。</span> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <span style="font-size:14px;"></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>一、性能优化篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括经典 MySQL 问题剖析、索引底层原理和事务与锁机制。通过深入理解 MySQL 的索引结构 B+Tree ,学员能够从根本上弄懂为什么有些 SQL 走索引、有些不走索引,从而彻底掌握索引的使用和优化技巧,能够避开很多实战中遇到的“坑”。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>二、MySQL 8.0新特性篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括窗口函数和通用表表达式。企业中的许多报表统计需求,如果不采用窗口函数,用普通的 SQL 语句是很难实现的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>三、高性能架构篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">主要包括主从复制和读写分离。在企业的生产环境中,很少采用单台MySQL节点的情况,因为一旦单个节点发生故障,整个系统都不可用,后果往往不堪设想,因此掌握高可用架构的实现是非常有必要的。</span> </p> <p style="text-align:justify;"> <br /> </p> <p style="text-align:justify;"> <span style="font-size:14px;"><strong>四、面试篇:</strong></span> </p> <p style="text-align:justify;"> <span style="font-size:14px;">程序员获得工作的第一步,就是高效的准备面试,面试篇主要从知识点回顾总结的角度出发,结合程序员面试高频MySQL问题精讲精练,帮助程序员吊打面试官,获得心仪的工作机会。</span> </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页