OS专题-了解CPU

OS专题-了解CPU

我们常说的16位电脑、32位电脑、64位电脑,代表的是CPU一次工作最多可以处理的数据位数。16位电脑一次最多处理16位,32位、64位依此类推。若我们要在16位的CPU上处理32位的数据,就需要好几个周期才能处理完。所以现在市面上的CPU大都是64位的(即一个周期可以处理64位的数)。

下面我们将介绍16位实模式环境,因为所有操作系统必须从这里开始,然后稍后我们将看到如何切换到32位保护模式以及这样做的主要好处。

16位实模式

为了让我们只编写一次操作系统就可以在所有的计算机上运行,就必须让CPU的指令集统一——CPU规格兼容。这一点CPU制造商很早就意识到了,所有他们必须让其下一代的CPU(即指令集)与较早的CPU兼容。

Intel的CPU是最早的,其系列中的CPUIntel 8086,它支持16位指令,没有内存保护的概念。内存保护对现代社会的稳定至关重要。因为它允许操作系统限制用户进程访问内存。这样的好处在于它可以保护内核不被非法篡改,若是病毒修改了内存中的内核代码后果可想而知。

16位实模式其实就是为了向后兼容,最早的CPU初始引导16位实模式,为了兼容旧的操作系统,这个模式仍然可用,并且要求现代操作系统最初的引导也应为16位实模式,之后再调整到32位(或64位)保护模式。

32位保护模式

为了更充分地利用CPU,并更好地理解CPU体系结构的发展如何有利于现代操作系统,即硬件中的内存保护,那么我们必须进入32位保护模式。32位保护模式相比16位实模式有如下特点:

  • 寄存器扩展到32位,我们可通过在寄存器名称前添加一个E来访问,例如:MOV EBX,0x274fe8fe
  • 新增了两个通用段寄存器FSGS
  • 偏移量长度增加到32位,因此一个偏移量可以引用4GB的内存(0xffffffff)。
  • CPU支持了更为复杂的内存分段方法,这提供了两大优势:
    • 可以禁止一个段中的代码执行拥有高级权限段中的代码,这样您就可以保护内核代码不受用户应用程序的影响
    • CPU可以为用户进程实现虚拟内存,从而可以根据需要在磁盘和内存之间透明地交换进程内存的页面(即xed-sized块)。这支持了我们可以根据代码的执行频率高效的分配内存,执行频率较低的代码或数据就可以放在虚拟内存中。
  • 提供更为复杂的中断处理

将CPU从16位实数模式切换到32位保护模式最困难的部分,就是我们必须在内存中准备一个称为全局描述符表(GDT)的复杂数据结构,它定义内存段及其保护模式属性。一旦我们设计了GDT,我们就可以使用特殊指令将其加载到CPU中,然后在特殊的CPU控制寄存器中设置一个位来进行实际的切换。如果我们不用汇编语言编写GDT,这个过程将非常简单,但遗憾的是,不论使用哪种高级语言(如C)编译的内核,这种低级转换是不可避免的,这些内核通常将被编译为32位指令,而不是效率较低的16位指令。

注意:一旦切换到32位保护模式,我们就不能再使用BIOS了。


OS专题-了解CPU
https://blog.cikaros.top/doc/4cd4de27.html
作者
Cikaros
发布于
2022年9月22日
许可协议