软件都是建立在硬件的基础之上,这个硬件在我们这里就是cpu、内存、硬盘、键盘、屏幕等等,而至关重要的则是cpu——这个核心中的核心。
x86系列CPU
目前在我们学习linux内核的过程中,所使用到的cpu都是比较早期的cpu, Intel 8086、80386这些。
80386是x86系列的cpu
x86是指一系列基于intel
8086且向后兼容的中央处理器指令集架构,最早的8086处理器于1978年推出,是16位处理器,后续的处理器命名都是以80x86命名,其中就包括80386。
80386的特点是其内存地址访问长度从16位扩展到32位,从而能够寻址最大4GB地址空间。
作为一个硬件,80386具有三种工作模式:
工作模式 | 应用场景 | 特点 |
真实模式 | DOS系统 | . 直接内存访问空间限制在1M字节,只有分段,代码和数据放在不同区域,操作系统和用户程序没有区分开,指针都指向实际物理地址 |
保护模式 | Linux系统 | .访问4G字节内存,具备异常处理机制。支持分页机制,支持虚拟内存,支持多任务优先级,区分开操作系统跟用户程序 |
虚拟模式 | 虚拟86模式 | . 可同时模拟多个8086处理器进行并发处理 |
冯诺依曼结构
要说cpu的结构,首先要说的则是冯·诺依曼结构
冯诺依曼存储程序计算机在体系结构上主要特点有:
- 以运算单元为中心
- 采用存储程序原理
- 存储器是按地址访问、线性编址的空间
- 控制流由指令流产生
- 指令由操作码和地址码组成
- 数据以二进制编码
cpu基本结构
cpu 由运算器、控制器、寄存器等器件组成,这些器件依靠内部总线相连接,依靠外部总线与其他组件联系。
其基本结构如下:
80386寄存器组
其中以80386为代表,其寄存器组如下:
操作系统代码的编写需要遵循CPU的使用手册,CPU有什么能力,操作系统代码才能够在这个能力基础之上进行开发功能、组合功能,从而层层嵌套,向上扩展功能。
80386的寄存器具体如下,在后续的章节中,我们则会使用到这些寄存器,来为操作系统打下基础,实现分段、分页、中断等基础功能,在这些基础功能之上,才能够继续开发,实现内存管理,任务调度,文件系统以及用户程序上层应用。
从这个发展的角度来讲,我们会发现,这真是一件神奇的事情。
寄存器详细结构
CF(Carry Flag):进位标志位; PF(Parity Flag):奇偶标志位; AF(Assistant
Flag):辅助进位标志位; ZF(Zero Flag):零标志位; SF(Singal Flag):符号标志位; IF(Interrupt
Flag):中断允许标志位,由CLI,STI两条指令来控制;设置IF位使CPU可识别外部(可屏蔽)中断请求,复位IF位则禁止中断,IF位对不可屏蔽外部中断和故障中断的识别没有任何作用;
DF(Direction Flag):向量标志位,由CLD,STD两条指令来控制; OF(Overflow Flag):溢出标志位;
IOPL(I/O Privilege
Level):I/O特权级字段,它的宽度为2位,它指定了I/O指令的特权级。如果当前的特权级别在数值上小于或等于IOPL,那么I/O指令可执行。否则,将发生一个保护性故障中断;
NT(Nested
Task):控制中断返回指令IRET,它宽度为1位。若NT=0,则用堆栈中保存的值恢复EFLAGS,CS和EIP从而实现中断返回;若NT=1,则通过任务切换实现中断返回。在ucore中,设置NT为0。