[自制操作系统] 第05回 CPU的三种模式
目录
一、前景回顾
二、实模式和保护模式
在之前我们说到,loader的作用才是读取加载操作系统内核,那么我们的重心就应该是loader.S文件,其实我们接下来也的确是会往loader.S中不断填充代码。只是现在我不想开门见山就去开始完善loader.S,对于初学者来说,知其然更要知其所以然,如果我说接下来要开始往loader里面填充全局描述符表等一系列数据结构,可能大多数人是比较懵的,这个东西是什么?有什么作用?所以,我觉得有必要花费一些章节来讲解一下CPU的三种模式,当你了解了这三种模式后,再回过头来看我前面说的东西,就多半能够理解了。这三种模式分别为实模式、保护模式和长模式。我们首先来看前两种模式,事实上在我们这个操作系统中最后也就只涉及到前两种模式。
结合历史背景,Intel 8086是由Intel在1978年所设计的一款16位微处理器,是x86架构的鼻祖。我们要知道当时是没有现在的实模式、保护模式、32位、64位等这些概念的。当时的程序员编写程序就像是我们前面编写的那样,指定一个地址存放代码,让CPU去执行就可以了。
但是这样的设定有着诸多的缺点:
1、操作系统和用户程序处于同一特权级,没有区别对待。
2、用户程序可以自由修改段基址,可以随意访问内存。
3、用户程序所引用的地址都是指向真实的物理地址,也就是说逻辑地址就等于物理地址。
4、一次只能运行一个程序,无法充分利用计算机资源。
5、访问超过64KB的内存区域时就要切换段基址。
6、共有20条地址线,最大内存空间也就只有1MB。
其实对于当时来说,第六条的缺陷是无法容忍的,因为随着计算机事业的不断发展,程序对内存的需求是不断增大的,如果还是1MB的内存,简直是让人捉襟见肘。于是Intel又于1985年推出了首款地址总线和寄存器都是32位的处理器80386,80386的内存空间有4GB大小,算是解决了第六个问题。后面我们都知道又推出了64位处理器,理论上可支持的内存空间就有16711425TB之大。
内存空间的问题解决了,但是考虑到之前的CPU运行模式下的安全缺陷,处理器厂商便开发出了保护模式。没有对比就没有伤害,我们就不花其他篇幅来讲解保护模式,我们就看看针对前面五个问题,保护模式是如何解决的。
1、针对第一和第二个问题,保护模式增加了特权级,这里我们可以理解为增加了内核级和用户级的两种特权级别,不同的级别有着不同的权限,内核级的特权高于用户级的特权。这样的话处于用户级的用户程序就不能随意访问处于内核级的操作系统,段寄存器属于操作系统管辖的内容,用户程序是无法直接修改的,因此这两个问题得到了解决。
2、针对第三个问题,保护模式引入了内存分页机制,这里先不去讲述何为分页机制,我们只需要知道,在保护模式下,用户程序所引用的地址变成了虚拟地址,不再是真实的物理地址,虚拟地址到物理地址的映射由操作系统和处理器来完成,这样就完美地解决了第三个问题。
3、针对第四个问题,保护模式引入了分时机制,每个进程有着事先划分好的时间片,当时间片用光后,进程自动让出CPU,让下一个进程接受调度,极大地提高了计算机的运行效率。当然,这些后面会再详细补充到。第四个问题也就解决了。
4、第五个问题呢,其实不算是保护模式所解决的。我们知道,实模式下的内存访问方式是“段基址:段内偏移”,之前是因为寄存器的位数只有16位,所以导致段内偏移只能有2^16=64KB大小,超过64KB大小后就需要更改段寄存器的值才能访问到其他地方的内存。自从32位CPU带着32位寄存器出现以后,段内偏移就达到了2^32=4GB大小。因此第五个问题就迎刃解决了。
所以为什么会有实模式呢?只是因为后来人为了区分保护模式,于是便给以前的模式取名为实模式,为了凸显现在新模式的优势,称新模式为保护模式。
这里需要强调一下,16位CPU只能运行在实模式下,而32位CPU是可以运行在实模式和保护模式下的。这是考虑到兼容的原因,无论CPU的位数多少,只要还是X86架构下的CPU,一开始都是通过一样的流程来完成系统的初始化,所以会出现我们的CPU一开始处于实模式下,随后又跳转到保护模式下的现象。这里仅仅是针对的32位CPU。如果是16位CPU,那么从始至终都将只是运行在实模式下,如果是64位CPU,最后还会从保护模式跳转到长模式下。
至于长模式,简单的来说就是寄存器变成了64位,因为我对这个没有深入了解,所以这里就点到为止了。
总结一下,要想认识保护模式,我们就需要从它的三个特点来入手:
1、地址映射
2、特权级
3、分时机制
后面的章节便会围绕但不限于这三个点来充分展开,我们会在认识了解这三个特点的同时,不断完善我们的loader.S文件。不过在此之前,我们需要先迈入保护模式。
欲知后事如何,请看下回分解。