#Orange's 自制OS系列笔记(5)#保护模式(1)


x86CPU主要有三种工作模式,分别是 实模式保护模式和 虚拟8086模式。

实模式

在8086CPU中,只有实模式一种工作模式。实模式有自己独特的寻址方式  段地址:偏移地址 ,它实际对应的物理地址为:

实际物理地址 = 段地址 * 16 + 偏移地址

16位的8086CPU,它的内部总线宽度是16位 ,外部总线(即地址总线)宽度是20位,寻址空间为1 M 。 段地址和偏移地址都是16bit的数据,原本寻址空间最大只有64KB,但是为了使得寻址空间能够达到1M,所以采用了将段地址乘以16的方法,即将二进制的段地址向左移4位,凑够20位。

比如 2000H:0002H,段地址 = 2000H,偏移地址 = 0002H,那么实际物理地址就是 20002H .  段地址和偏移地址会通过地址加法器产生实际物理地址,并将其传输给外部地址总线,见下图:



这里要注意 “段” 只是人为分段,实际内存并没有分段,内存中任何一个段的开始地址永远是16的倍数,而由于偏移地址只有16bit,所以一个段的最大长度也只有 64KB。 实模式只能访问地址在1M以下的内存,也就是说实模式下CPU的寻址空间只有1M。

保护模式

32位的80x86CPU主要工作在保护模式下,但是为了向前兼容8086/8088的CPU,运行一些旧的软件,也可以工作在实模式下,也就是说intel的32位CPU完全兼容16位的CPU,可以使用16位CPU的寻址方式 ,但是保护模式的寻址方式和实模式则不一样。 之所以叫做 ”保护“模式,是因为在保护模式中对访问进行了权限控制,以达到保护的目的。在实模式中,系统程序和应用程序具有相同的权限,这就造成了一些安全隐患。 在保护模式中,”保护"主要体现在两个方面:

不同任务之间的保护:
通过把不同任务放在不同的虚拟地址空间中,实现不同任务之间的隔离(即A程序不能访问和修改B程序的代码和数据),以达到程序间的隔离。

同一任务之间的保护:
在每一任务之内定义了4种保护级别 ,  通过Ring级别进行了访问控制,以 环的方式表示见下图:



Ring级别从上图可看出一共分为4个层次, 依次是 Ring0,Ring1,Ring2,Ring3、其中Ring0权限最大,Ring3权限最小 ,工作在某一层的程序只能访问权限小于等于它的数据,执行权限小于等于它的指令。 

但是常见操作系统比如 windows 操作系统  和 linux 操作系统,都只是使用了Ring0和Ring3两层,其中操作系统内核工作在Ring0层,普通应用程序工作在Ring3层,也就是说系统程序可以访问所有数据,而普通应用程序无法访问高于R3层的数据。

虚拟8086模式

虚拟8086模式顾名思义,就是“虚拟”的8086模式,8086模式指的就是实模式,也就是说“虚拟的实模式”,它是指在保护模式上虚拟一个实模式,目的是在32位保护模式下执行16位程序。


下一篇笔记 继续 写保护模式(Protect Mode)。

该系列笔记也载于俺的个人网站:    http://zhangjinkun.com  , 欢迎访问。





#C++工程师#
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
拒绝无效加班的小师弟很中意你:求职意向没有,年龄、课程冗余信息可以删掉,需要提升项目经历。排版需要修改。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务