概述
操作系统的共性
-
从硬件的角度来看:
- 管理硬件
将硬件资源纳入统一的管理
- 对硬件提供抽象
将有限的、离散的资源抽象成无限的、连续的资源
- 管理硬件
-
从应用的角度来看:
- 服务于应用
提供了不同层次的接口(系统调用)以满足应用的需求
- 管理应用
对应用的生命周期进行管理(加载、启动、切换、调度、销毁)
- 服务于应用
操作系统接口
-
系统调用接口
- 应用程序通过系统调用向操作系统内核申请服务
-
POSIX接口
- Portable Operating System Interface for uniX (可移植操作系统接口)
ChCore:一个简单的实验操作系统
- ChCore包括两个部分:
- 运行在内核态的ChCore为内核
- 运行在用户态的各种操作系统服务
ARM硬件结构
AArch64中特权级
AArch64的特权级别分类
- AArch64中的特权级别被称为异常级别,共四种:
- EL0:
- 用户态
- EL1
- 内核态
- EL2
- 虚拟机监控器(VMM,也称为Hypervisor)
- EL3
- 和TrustZone相关,负责普通世界(normal world)和安全世界(secure world)之间的切换
从EL0到EL1的场景
- 系统调用
- 指令触发异常(exception)
- CPU收到中断(interrupt)
前两种属于同步的CPU特权级切换,是由CPU中正在执行的指令导致的
第3种称为异步的CPU特权级切换
保存现场的状态
- 在发生特权级切换时,CPU负责保存当前执行状态,以便操作系统内核在处理异常时使用,并在处理之后恢复应用程序的执行。
- 要保存的内容包括:
- 触发异常的PC, 保存在ELR_EL1(异常链接寄存器)
- 异常原因, 保存在ESR_EL1(异常症状寄存器)
- 栈指针从SP_EL0切换到SP_EL1
- 其他状态:CPU的相关状态保存在SPSR_EL1(已保存的程序状态寄存器),引发缺页异常的地址保存在FAR_EL1(错误地址寄存器)
异常向量表
- 异常向量表中为不同的异常类型配置相应的异常处理函数
- 发生特权级切换时,CPU读取VBAR_EL1(向量基地址寄存器)来获的异常向量表的基地址,根据异常原因(ESR_EL1中保存的内容)调用相应的异常处理函数。
AArch64寄存器
- 31个64位通用寄存器: X0 ~ X30
其中:- X29:栈指针寄存器(FP)
- 保存函数调用过程中栈顶的地址
- X30:链接地址寄存器(LP)
- CPU在执行函数调用指令bl时,会把返回地址保存在其中
- X29:栈指针寄存器(FP)
- EL1特权级下有两个页表基址寄存器(TTBR)
负责翻译虚拟地址空间中不同的地址段。- TTBR0_EL1
- TTBR1_EL1
物理缓存
相联度
- 组相联 = 组内全相联,组间直接映射
= 路内直接映射, 路间全相联
缓存结构
- CPU缓存是由若干个==缓存行(cache line)==组成的(常见64B)
- 物理地址包括分为三个部分:
tag index offset 路(way) 组(set) 缓存行内偏移量
AArch64缓存寻址
- 物理地址长度44位(2^44)
- 缓存大小为32KB(2^15)
- 缓存行大小为64B(2^6)
- 缓存内有2^9=512个缓存行
- 2路组相联
- 分成256个组(组间直接映射)
- 每个组2个缓存行(组内全相联)
- 寻址过程:
- 先定位组(对比index部分)
- 找到组后,在组内找块(对比tag部分)
设备与中断
内存映射输入输出(MMIO Memory-Mapped I/O)
把输入输出设备和物理内存放到同一个地址空间,为设备内部的内存和寄存器也分配相应的地址。