
本次实验的难度较为简单主要是查资料比较麻烦可以把文档或者arm开发者的网站喂给ai预计完成时间180分钟1 实验项目一1.1 项目名称中断、异常和陷阱指令是操作系统的基石现代操作系统就是由中断驱动的。本实验和实验五的目的在于深刻理解中断的原理和机制掌握CPU访问中断控制器的方法掌握Arm体系结构的中断机制和规范实现时钟中断服务和部分异常处理等。1.2 实验目的实现中断和异常处理1.3 实验资源2 实验任务——ARMv8的中断与异常处理2.1 异常向量表上图所示为AArch64中的异常级别(Exception levels)的组织。可见AArch64中共有4个异常级别分别为EL0EL1EL2和EL3。在AArch64中Interrupt是Exception的子类型称为异常。 AArch64 中有四种类型的异常 • SyncSynchronous exceptions同步异常在执行时触发的异常也是作业1的异常例如在尝试访问不存在的内存地址时。• IRQ Interrupt requests中断请求由外部设备产生的中断• FIQ Fast Interrupt Requests快速中断请求类似于IRQ但具有更高的优先级因此 FIQ 中断服务程序不能被其他 IRQ 或 FIQ 中断。• SError System Error系统错误用于外部数据中止的异步中断。只有在以下情况异常的优先级会发生更改取得异常返回异常进程重置在调试debug状态退出调试debug状态标准的偏移实现这就是中断向量表trap table• 发生于当前异常级别的异常且SPSel寄存器选择SP0 4 Sync、IRQ、FIQ、SError对应的4个异常处理。• 发生于当前异常级别的异常且SPSel寄存器选择SPx 4 Sync、IRQ、FIQ、SError对应的4个异常处理。• 发生于较低异常级别的异常且执行状态为AArch64 Sync、IRQ、FIQ、SError对应的4个异常处理。• 发生于较低异常级别的异常且执行状态为AArch32 Sync、IRQ、FIQ、SError对应的4个异常处理。2.2 上下文保存与恢复2.2.1 Arm架构汇编语法stp x1, x0, [sp,#-16]!这是ARM Aarch64架构的指令stp 意为 store pair将寄存器的值存储到栈空间中。x1 x0寄存器分别存入sp栈指针的地址占用16个字节在存放后栈指针向下移动16字节ldp xzr, x30, [sp],#16对称地这是load pair将栈空间的值读入到寄存器中。这次是sp栈指针先16然后再往下读取16字节这是存储的逆过程。它完成了书上OSTEP LDE机制中的context-switch机制2.3 异常处理函数EL exception levelelx 代表了所有的一场级别终于可以介绍几个系统寄存器了寄存器全名 名字 作用异常综合寄存器 ESR Exception Syndrome Reg 包含了异常症状的原因错误地址寄存器 FAR Fault Address Register 存储了错误的虚拟地址状态位寄存器 SPSR Saved Program Status Register 存储了程序的状态位异常链接寄存器 ELR Exception Link Register 存储了造成异常的指令Data Synchronization Barrier (DSB)数据同步屏障指令强制让核心等待所有的待处理的显式数据访问都结束在此之后才能执行后续的指令但是不影响预取指操作。Data Memory Barrier (DMB)数据内存屏障保证此语句之前的内存访问一定会在之后的显式内存访问之前被观察到。不影响指令执行的顺序不影响预取指。Instruction Synchronization Barrier (ISB)指令同步屏障刷新了核心的管道和预取指空间所以说在这个指令完成后ISB指令之后的所有指令都是在缓存或者主存被得到的。它确保上下文切换的效果。比如CP15系统控制如MMU或者地址空间序列或者快表或者分支预测操作在ISB指令执行之前的指令对于ISB之后的指令而言是可见的。ISB在这里面不会导致数据和指令缓存之间的同步但是在同步操作里面需要ISB。这两个宏定义除了内核处理函数不一样别的都是一样的。核心思想是保存关于异常的系统寄存器的上下文然后使用内存屏障和指令屏障刷新缓冲区。编译后注释掉FPU启用代码导致运行到main函数无法继续调试2.4 系统调用陷阱OS_EMBED_ASM 在 prt_typedef.h 中定义为asmvolatile用于 C 与 ASM 混合编程。2.4.1 Clobber的作用上图中有“::”r”(Test_SVC_str[0])”字样这是个列表目的是“揍”这个编译器告诉他这个寄存器内存地址我要用你那些编译出来的汇编代码都不准用。the constraint “r“ specifies one of the registers R0-R15 in ARM state, while “m”is a memory address and “w” is a single precision floating-point register.起到了阻止逻辑混乱寄存器混用的作用。2.4.2 SVC系统调用The Supervisor Call (SVC) instruction enables a user program at EL0 to request an OS service at EL1监管者调用指令使得用户态可以向内核态发送指令int ExcClass (excRegs-esr0xfc000000)26;刚好取出EC的值错误的种类非常多这里不多赘述Arm A-profile Architecture Registers2.5 成品展示2.6 Lab4作业1查找 启用FPU 前异常出现的位置和原因。禁用FPU后PRT_Printf工作不正常需通过调试跟踪查看异常发生的位置和原因 elr_el1 esr_el1 寄存器由于没有启用FPU浮点运算单元导致内存的这个位置没有办法被访问通过-exec i r得知ESR_EL1 0x1fe00000 534773760EC 0001 11(31:26) IL 1([25]) ISS CV1[24] COND1110([23:20])For exceptions taken from AArch64, this field is set to 0b1110.ELR_EL1 0x4000200c 1073750028Instruction Specific Syndrome指令特定综合信息访问了某些受到控制器限制的浮点运算功能ELR存储了错误的地址ldr q0,[x0] 应该是q0是FPU中的寄存器但是FPU没有启用SyncSynchronous exceptions同步异常在执行时触发的异常例如在尝试访问不存在的内存地址时。q0是SIMD专用的128位寄存器找到错误2.7 附录W和X系列寄存器的关系这里把向量表的地址给寄存器x0再把x0的值给到系统寄存器VBAR_EL1切记切记一定要在main之前给它初始化了要不然根本就没有中断向量表这里浪费了很久时间3 总结3.1 实验中出现的问题 这个代码的逻辑位置非常重要 英语太多了长难句很难看懂3.2 真实感受 要多和别人交流错误情况 多读官方文档带着问题去读