现代操作系统原理与实现-硬件结构篇


引言

操作系统是建立在硬件结构基础上的软件实现,这一章节我们来介绍计算机的硬件结构.

CPU与指令集架构

指令集架构是cpu与软件之间的桥梁,包括指令集\特权级\寄存器\执行模式\安全扩展\性能加速等等

指令集

指令集包括精简指令集(RISC)复杂指令集(CISC)两种.

  • 精简指令集
    指的是没有寄存器的指令集,通过指令来模拟寄存器的操作,常见的安卓和苹果的A系/M系芯片都是使用的这种指令集

  • 复杂指令集
    指的是有寄存器的指令集,通过使用寄存器来执行指令,常见的Intel的X86芯片都是使用的这种指令集

目前在生产中并没有严格隔离指令集,CISC也在集成RISC的相关指令

常用的指令类型分为4种:

  • 数据搬移指令(mov等)
  • 寄存器计算指令(add/sub等)
  • 内存读写指令(ldr-加载/str-读写等)
  • 调整指令(b)
  • 过程调用指令(bl/ret)
  • 特权指令(mrs/msr)

特权级

指的是指令运行的级别,分别是El0,El1,El2,El3

  • El0
    指的是最低特权级,应用程序通常运行在这一级别上,也可以称为用户态

  • EL1
    操作系统通常运行在这一级别上,也称为内核态

  • El2
    指的是次高特权级,操作系统通常运行在这一级别上,也称为高级内核态,通常虚拟机监控器需要运行在这一状态

  • El3
    负责普通世界与安全世界的切换,安全世界是AArch64提出来的一个管理硬件交互的级别,EL3在级别上是最高的,因为可以直接操作硬件

EL0 < EL1 < EL3 < EL3

程序在运行过程中大量的发生EL0 <=> EL1转换,其实就是用户进程与内核进程在不断的进行切换的过程;这里需要注意一点的是中断是运行在EL1级别上的

中断切换

寄存器

寄存器是指令集中的一种数据结构,用于存储数据,比如寄存器中存储的是指令的地址,寄存器中存储的是指令的参数等等.它们是cpu的基本架构组成部分,参与指令的执行和计算过程.现代CPU往往会使用大量专用的寄存器来做专业的事情,比如帧指针寄存器,连接寄存器等

物理内存与CPU缓存

  • 物理缓存

CPU在执行的过程中,可以通过访存指令不断的向物理内存中读写数据;CPU使用物理内存的方式很简单:通过总线向物理内存发生一个读写请求,其中包括目标地址,物理内存在接收到请求后,会根据请求的类型进行读写操作,并返回相应的结果

通过以上的描述可以得知CPU在进行执行时都是通过总线与内存进行交互\cpu从内存中取值后会放到私有的区域(CPU缓存)中,其实这样的设计也加大了应用人员开发出健壮/正确的并发代码难度,在编写并发相关代码时一定要仔细

  • CPU缓存

CPU缓存是一个私有的区域,用于存储CPU执行过程中的数据;由若干个缓存行组成.每个缓存行包含:一个有序位标识标识数据是否有效和一个标记地址用于标记其对应的物理地址;

CPU以缓存行(常见的是64bit大小)为单位把物理内存读取到缓存中,也就是说如果只需要一个bit的数据,但是还是需要把该字节对应的缓存行数据全部读取到缓存中,写入反之亦然也是每次需要写出64bit大小的数据

对于CPU缓存行最熟悉的一个作用是禁止指令重排,在java中我们知道valitate的一个作用是可见性,就是根据基于缓存行的缓存一致性协议-MESI协议来实现的

volatile的另外一个作用是可以解决编译器层面的可见性与重排序问题。而内存屏障则解决了硬件层面的可见性与重排序问题

设备与中端

常见的设备指的是输入与输出设备,常见的内存映射输入输出设备,常见的中断设备,比如硬盘,光驱,键盘,鼠标等

中断机制是提供设备主动通知CPU的能力.设备通过向CPU发送中断来打断CPU的执行.

小结

本章主要介绍精简指令集<B>特权级<B>寄存器<B>内存与缓存等硬件基本结构
多核CPU缓存的设计遵守缓存一致性协议这个是valotail可见性的基础

参考资料

CPU缓存


  TOC