您的位置:首页 > 其它

x86 CPU的操作模式 保护模式下的特权级

2012-12-06 21:36 253 查看
32位Intel处理器拥有三种基本模式:

****保护模式:纯32位保护执行环境。该模式拥有一个子模式,虚拟8086模式:

****虚拟8086模式:是运行在保护模式中的实模式,为了在32位保护模式下执行纯16位实模式程序。它不是一个真正的CPU模式,还属于保护模式。

****实模式:纯16位无保护执行环境。

保护模式下的特权级

在保护模式下提供4级特权级PL(Privilege Level),呈现环形保护(ring-protection)结构。最内的环具有PL=0的最高特权级,依内向外逐层PL值增加,特权级降低。最外的环PL=3,特权级最低。特权级有以下几种形式表述:DPL(Descriptor Privilege Level):描述符的特权级,CPL(Current Privilege Level):当前任务的特权级,RPL(Requestor Privilege Level):请求特权级(选择符的特权级),EPL(Effective Privilege Level):有效特权级,IOPL(I/O Privilege Level):I/O特权级 ,目前Windows,Linux等只用到了其中两级,即:0级(核心态)和3级(用户态).

CPL是当前进程的权限级别(Current Privilege Level),是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位。

RPL说明的是进程对段访问的请求权限(Request Privilege Level),是对于段选择子而言的,每个段选择子有自己的RPL,它说明的是进程对段访问的请求权限,有点像函数参数。而且RPL对每个段来说不是固定 的,两次访问同一段时的RPL可以不同。RPL可能会削弱CPL的作用,例如当前CPL=0的进程要访问一个数据段,它把段选择符中的RPL设为3,这样 虽然它对该段仍然只有特权为3的访问权限。

DPL存储在段描述符中,规定访问该段的权限级别(Descriptor Privilege Level),每个段的DPL固定。

当进程访问一个段时,需要进程特权级检查,一般要求DPL >= max {CPL, RPL}

下面打一个比方,中国官员分为6级国家主席1、总理2、省长3、市长4、县长5、乡长6,假设我是当前进程,级别总理(CPL=2),我去聊城市 (DPL=4)考察(呵呵),我用省长的级别(RPL=3 这样也能吓死他们:-))去访问,可以吧,如果我用县长的级别,人家就不理咱了(你看看电视上的微服私访,呵呵),明白了吧!为什么采用RPL,是考虑到 安全的问题,就好像你明明对一个文件用有写权限,为什么用只读打开它呢,还不是为了安全!

保护模式同实模式的根本区别是进程内存受保护与否。可寻址空间的区别只是这一原因的果。实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待,而且每一个指针都是指向"实在"的物理地址。这样一来,用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值,那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的。为了克服这种低劣的内存管理方式,处理器厂商开发出保护模式。这样,物理内存地址不能直接被程序访问,程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知。至此,进程(这时我们可以称程序为进程了)有了严格的边界,任何其他进程根本没有办法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的,因为有一些虚拟区域已经被放进一些公共系统运行库。这些区域也不能随便修改,若修改就会有: SIGSEGV(linux 段错误);非法内存访问对话框(windows 对话框)。

CPU只有在刚刚启动的时候是real-mode,等到linux操作系统运行起来以后就运行在保护模式。实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存。在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务切换和保护任务环境; 4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离; 支持虚拟8086方式,便于执行8086程序。

首先,80386以及80386以后的CPU都是32位的。

纯32位windows是不能进入实模式的,重启以后到载入WINDOWS以前都是实模式,也许你会说windows98不是是可以不用重启机器直接进入到纯DOS(实模式)下么?首先,98是个16位和32混编的系统,所以不稳定,但对游戏支持甚好,而且其内核是建立在16位上的(你要是搞过Win32编程就会有所了解),这样的话进入DOS很方便,或者在DOS下一条win命令就可以进入WINDOWS...

但是从NT开始就不行了,2000/XP都是建立在纯32位(NT开始)内核上的,所以很稳定,但是如果不重新启动到DOS下是不能进行实模式操作的,但是考虑程序的兼容问题,为了让以前的16位程序能在32位下运行,80386就提供了虚拟86模式(这和windows无关,是CPU提供的模式,另外可以告诉你,因为80286没有虚拟86模式,只有实模式和保护模式,当时一些流行的16位程序要使用的话必须重启到DOS下,再进到到保护模式),虚拟86模式实际上就是模拟16位的8086CPU的实模式,但这和实模式有很大区别,最大的应该算是中断被屏蔽或转为windows的异常处理了,这样你要用诸如:int 13h 命令是行不通的,因为windows是建立在保护模式上的,保护模式下有自己的中断模式,如果你要从windows进入实模式的话只有重新启动再到DOS下了。

现在几乎不需要进入实模式了,除非你windows中了毒不能进入,到DOS下重装/恢复/备份系统,还有就是一些硬件底层的破解啦,比如破解还原卡之类的。

进入保护模式是每个32位系统必须的,因为这样系统才能才能利用保护模式提供的保护机制管理和维护自己,程序也就稳定了,

虚拟86模式没什么需要不需要,CPU提供这个模式,程序是16位的时候,系统会自动加载到虚拟86模式中运行...

我们在windows下打开的cmd(别忘了98下叫MS-DOS方式,这个模式仍是在16的内核上,而从NT开始的CMD就是纯32位了!!!!)它在系统中的定义是字符模式(非窗口),这样给一些16位的程序提供了运行环境....

1)特权指令:只能在最高级别(0)状态下执行,在低级别状态下执行会产生Trap。敏感指令:位于虚拟机的Guest OS不再属于CPU最高级别,而本来的特权指令就不能被执行了,而需要先交由VMM处理后再执行。

2)由于某些敏感指令不属于特权指令,因此在执行这些敏感指令时,并不会产生Trap而被VMM所捕获,从而阻碍了指令的虚拟化。

3)模拟I/O虚拟化方法的最大开销在于处理器模式的切换:包括从Guest OS到VMM的切换,以及从内核态的VMM到用户态的I/O进程间的切换。

4)全虚拟化,VMM提供虚拟硬件层,翻译核心指令代替不能虚拟化的指令;半虚拟化,对Guest OS内核进行修改,以便操作系统能够自行对有缺陷的指令进行替换;硬件虚拟化,引入新的指令和处理器运行模式,由硬件支持VMM和Guest OS之间的切换。

5)虚拟机指令的正确执行,指的是指令的执行结果不改变其他虚拟机状态的情况下,保证整个虚拟机环境的正确和有效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: