实模式:奇葩的存在
每次看操作系统,都有关于实模式和保护模式的介绍。
事情是这样的描述的:电脑启动时,运行在实模式,在启动过程中的某一个阶段切换成保护模式。
听懂了吗?就这么简单。其实我也不懂。既然后面启动的操作系统运行在硬件的保护模式下,为什么电脑开机不直接使用保护模式,而要先来个实模式?计算机讲究的就是简单更好啊。
于是我上网查阅大量的资料,其实就是看了很多博客,英语的文档读起来费时间,也就只能看看博客了,有点像打野。。。
于是,感觉看了一堆历史。
首先CPU由通用寄存器(用来存储CPU实现基础运算的操作数),其次CPU和内存通信需要线路相连接。
Intel的CPU是从16位CPU发展起来的,后来有了32位和现在流行的64位处理器。这些处理器为什么叫做16位、32位呢?
最大的区别就是通用寄存器的宽度,在最初的16位处理器中,通用寄存器只有4个,每个寄存器有16位这么大,这意味着什么?意味着CPU的每个操作数最多只有16个位来存储(一个寄存器)。比如CPU要计算a+b;则a只能存放到一个寄存器中,b也是,a+b的结果也是只能放到一个寄存器临时保存,后续再移动到内存中。16位能存放一个多大的数?2^16=65536。而当我们要寻找一个内存地址时,使用一个值表示这个地址,这个值也只能放在16位的寄存器中,意味着我们的内存地址范围只能在[0,65535]字节,超出这个范围的内存,抱歉,计算机没能力找到,因为保存地址的空间只有16位。那计算机内存能有多大?64KB。我的天哪?以前的计算机真的是不知道能干个啥。
说完CPU的通用寄存器,再来说说CPU和内存相连的线路,这个线路,能够传送20位宽度的值。。。waht????一家人就不能保持整整齐齐的吗?为什么不是16位?非要多4位出来,这4位是不是有点浪费?
没错,当时也有人是这么想的,于是他们把这4位加以利用,寻址的时候,虽然存储的值是16位,但是传送线路是20位,于是有人使用两个16位的寄存器中的值组合一下,组成一个20位的值,额,16位+16位不应该是32位吗?是的,但是线路只能传送20位的,所以就组成20位的了(组装方法:地址=寄存器A右移4位,寄存器B的值用来填充左边空的4位,这样凑齐20位),ε=(´ο`*)))唉,又造成了浪费,一家人就不能整整齐齐的吗?事实证明,计算机发展初期,当时考虑的也比较不周全,也没想到计算机会发展的这么牛。
那么,在这种改装下,寻址的能力就变成了2^20,也就是1MB,内存空间达到了1MB,碾压64KB的内存啊。
以上就是16位CPU的由来,早期Intel的CPU就是这样发展起来的。讲到这里,讲的一直都是实模式,当时没有实模式和保护模式的概念。
由于软件越来越丰富,硬件也该发展吧,于是出现了32位处理器,从32位的80286处理器出世之后,才发明出了保护模式这一说法。32位处理器拥有8个通用寄存器,每个寄存器都是32位的。当然,CPU的从16位到32位是发展,而不是革命。所以CPU总是兼容以前的CPU,为什么这样做呢?为了让以前运行在16位机器的程序能够直接放过来新的32位CPU上运行。不这样做有人会买你的CPU吗?比较32位CPU出世时市面上的程序都是16位的,要是不兼容以前的程序,用户要发飙的,要么选择不买CPU,要么选择重新写程序。为了让之前的程序能运行在新的CPU上,32位CPU就保留了16位CPU的能力,32位的8个32位通用寄存器中,有1/4是16位CPU的寄存器,名字都没变,相当于对之前的寄存器做了扩容。
然而32位CPU能够寻址32位的地址,也就是4GB。除了这个功能,32位处理器还发展出了很多的功能,与现代操作系统相辅相成,例如内存保护,分页系统,以及硬件支援的 虚拟内存,拥有这么多的功能,硬件自然要提供很多机制才能实现出来,这就叫做保护模式。
传统的16位处理器启动时就是在实模式,也就是纯裸的,没有任何支持。32位处理器为了兼容16处理器,把开机时的实模式也兼容了,所以即使是16位的操作系统,放到32位处理器上,仍然能运行。所以开机的时候CPU就是实模式,然后32位操作系统又将实模式切换成保护模式。如果发现是16位的操作系统,就直接运行在实模式好了。实模式的存在就能兼容之前的16位程序。
现在明白什么是实模式了吧,作为一个基于现代操作系统上层的开发者,可以完全不用知道实模式的存在也能正常工作。而如果你在学习操作系统,特别是操作系统的启动,就会涉及到这部分内容,让你眼前一黑,卧槽,这是什么?从来没听过。