x86-2-保护模式(protect mode)

2.1 引入保护模式的原因:

操作系统负责计算机上的所有软件和硬件的管理,它可以百分百操作计算机的所有内容。但是,操作系统上编写的用户程序却应当有所限制,比如只允许用户程序访问属于自己程序的内容,不然整个生态就很恶劣了,想象下你手机上的的微信被恶意软件给修改了,给你的所有好友群发黄色广告,你难受吗。

但是在之前8086CPU的工作模式也就是实模式的工作模式下,程序对软硬件的访问非常自由,没有任何限制,我们随随便便就可以修改内存上的数据,即使这个内存的范围不在我们程序的数据段里。这就和我们前面所想违背了。

因为在多用户、多任务时代,内存会有多个用户(应用)程序在同时使用,为了使它们彼此隔离,防止因某个程序的编写错误或者崩溃而影响到操作系统和其他用户程序,所以就有了保护模式。

也就是说保护模式就是为了防止某个程序影响操作系统和其它用户程序,每一个都相对独立。(操作系统也可以当作一个大型的程序)。

2.2 保护模式要保护什么内容:

实质上就是保护CPU中的某些资源不能被随意访问,包括硬件资源和操作系统的软件资源,比如说:内存、GDT、IDT等类型的系统级数据结构图以及OS 内核代码和数据等等。

2.3 保护模式根据什么来进行保护:

保护模式根据特权级来进行保护。

2.3.1 特权级:

在保护模式下,每个段都有一个特权级。intel的CPU特权级采用了0,1,2,3四种特权级,权限从高到低,也就是0级权限最高,3级最低。一般来说操作系统的特权级为0,用户程序的特权级最低为3。其中Windows只采用了0和3,也就是经常俗称的0环和3环。

特权级为0的程序拥有最高的权限,可以和实模式一样全方位操作计算机。其它特权级就权限依次往下。

拥有高特权级的代码可以对低特权级的数据进行访问,反之不行。

2.3.1 特权级:

intel的CPU特权级采用了0,1,2,3四种特权级,权限从高到低,也就是0级权限最高,3级最低。一般来说操作系统的特权级为0,用户程序的特权级最低为3。其中Windows只采用了0和3,也就是经常俗称的0环和3环。

特权级为0的程序拥有最高的权限,可以和实模式一样全方位操作计算机。其它特权级就权限依次往下。

在保护模式下,每个段都有一个特权级(Privilege Level)。

拥有高特权级的代码可以对低特权级的数据进行访问,反之不行。

保护模式使用了三种特权类型:

特权类型内容
CPL(Current Privilege Level) 当前特权级,表明当前代码的特权级,CPL的值存放在CS段选择子寄存器的Selector字段的RPL字段中,SS段选择子寄存器的RPL和CS.Selector.RPL始终是一样的所以SS.Selector.RPL也是CPL。
DPL (Descriptor Privilege Level) DPL存放在描述符里的DPL字段中,表明访问这些段所需要的权限。
RPL(Requested Privilege Level) 存放在段选择子中的特权级字段,表明请求获得该段描述符时所提供的特权级。

2.4 保护模式如何进行隔离和保护:

保护模式实施了种种访问限制,x86的段式管理(segmentation)和页式管理(paging)是实施保护措施的手段和途径。

segmentation机制和paging机制实行不同的内存管理模式和访问控制,对资源的访问先经过segementation阶段,然后如果还开启了paging就再经过paging机制。也就是说paging机制是一个可选项。

2.5 保护模式的运行环境:

CPU在进入保护模式前,必须先配置好保护模式的运行环境。

CPU进入保护模式的流程:

 

 

从实模式进入保护模式时,分段机制是必须建立的,分页是可选的,

小结

因为实模式太不安全,所以引入了保护模式,保护模式通过段式管理和页式管理根据段的特权级来进行保护和隔离,其中段式管理是必不可少的,页式管理是可选的。