编程模式)
ARMv8 ProfileA/R/M编程模式一、整体对比维度ARMv8-AARMv8-RARMv8-M典型软件栈Linux/Android Hypervisor(KVM) TrustZone固件RTOS(如AUTOSAR OS, VxWorks, QNX) 或裸机RTOS(FreeRTOS, RT-Thread, Zephyr)或裸机内存寻址方式虚拟地址进程独立地址空间物理地址MPU仅做保护不做转换物理地址MPU仅做保护不做转换系统调用方式SVC指令触发EL0→EL1切换走syscall tableSVC指令触发User→SVC模式切换SVC指令触发Thread→Handler模式切换是否需要用户手动管理页表是内核负责应用透明否无MMU概念否无MMU概念二、进程/任务隔离模型ARMv8-AARMv8-RARMv8-M隔离单位进程独立虚拟地址空间各自TTBR任务Task共享物理地址空间靠MPU regions隔离任务Task共享物理地址空间靠MPU regions隔离隔离粒度页级别4KB/16KB/64KB粒度Region级别通常几个到几十个固定大小regionRegion级别通常8-16个region上下文切换开销较大需切换TTBR、刷TLB/ASID较小只需切换MPU region配置很小只需切换栈指针PSP可选MPU region三、中断/异常处理编程方式ARMv8-AARMv8-RARMv8-M中断控制器GICGIC或简化中断控制器NVICISR写法汇编入口C语言处理函数需手动保存/恢复上下文部分由内核框架封装汇编入口C处理函数需手动保存部分寄存器非banked的直接写C函数即可作为ISR无需手动压栈硬件自动完成中断嵌套支持支持但需软件精心设计GIC优先级软件重开中断支持FIQ/IRQ两级原生支持NVIC硬件自动处理嵌套尾链优化(tail-chaining)四、特权切换/系统调用方式ARMv8-AARMv8-RARMv8-M用户态→内核态触发方式SVC #imm指令陷入EL1通过syscall编号分发SVC #imm指令陷入SVC模式OS服务分发SVC #imm指令陷入Handler modeOS服务分发五、内存管理编程方式ARMv8-AARMv8-RARMv8-M应用层内存分配malloc/free虚拟内存按需分页(demand paging)支持swapmalloc/free静态内存池更常见避免碎片化影响实时性极少用malloc多用静态数组/内存池避免堆碎片和不确定延迟内存保护配置方式页表项(PTE)配置权限位内核通过mmap/mprotect管理MPU寄存器直接配置region基址/大小/属性MPU寄存器直接配置region基址/大小/属性配置过程内核驱动/汇编启动代码配置MMU寄存器OS配置文件或启动代码中显式配置MPU regionsOS配置文件或启动代码中显式配置MPU regions六、应用编程差异Profile编程差异ARMv8-A应用代码运行在虚拟地址空间里的进程特权切换、内存管理基本被OS完全屏蔽ARMv8-R应用代码运行在物理地址空间里、通过MPU保护的实时任务需要关注确定性延迟需要理解OS的模式/中断设计ARMv8-M应用代码运行在物理地址空间里、可能完全裸机或轻量RTOS调度的代码该场景下中断处理极其轻量硬件自动压栈