本文说明cortex-m3/m4体系结构下和zephyr user mode相关的技术基础
本文主要涉及到Cortex-M3/M4的工作模式,特权模式,堆栈,MPU相关知识,本文是理解zephyr user mode的技术基础,重在原理性说明,设置细节可以参考技术文档和代码进行了解。
模式,特权,堆栈
Mode: Cortex-M3/4有handler和Thread两种模式,用于区分是exception还是应用程序代码。
Privilege: Cortex-M3/4有Privilege(特权) 和 Unprivileged(非特权) 两种模式,特权模式可以访问非特权模式的资源和使用一些特殊的CPU指令
SP: Cortex-M3/4有两个硬件堆栈指针MSP和PSP。
由以上三者组合(只能)了以下几种方式以及zephyr使用的情况:
Mode | Privilege | SP | Usage | Zephyr Usage |
---|---|---|---|---|
handler | Privileged | MSP | 异常处理程序用 | 异常,中断,系统调用 |
thread | Privileged | MSP | 特权程序用 | resest |
thread | Privileged | PSP | 特权程序用 | startup,kernel mode thread |
thread | Unprivileged | MSP | 非特权程序用 | 不使用 |
thread | Unprivileged | PSP | 非特权程序用 | user mode thread |
可以看出handler mode只能是特权模式使用MSP
设置
Cortex-m3/4 reset后就处于特权Thread Mode使用MSP。
在非特权下不能直接进行Mode/Privileage/SP修改。
在非特权模式下可以通过svc指令,进入handler mode(同时也是特权模式)。
在特权模式先可以通过写寄存器CONTROL[1]修改SP, 0: MSP, 1: PSP
在特权模式下可以通过写CONTROL[1]修改特权,0:Privileged, 1:Unprivileged
状态变化
Zephyr各状态和Cortex-m3/4状态的对应如下:
MPU
作用
MPU可通配置不同内存地址区域(region)的访问属性达到提高系统的安全性的目的:
- 阻止用户应用程序破坏操作系统使用的数据
- 阻止一个任务访问其它任务的数据区(任务隔开)。
- 可以把关键数据区设置为只读(数据保护)。
- 检测意外的存储访问(堆栈溢出)。
特性
Cortex M3/4的MPU可选配,要使用Zephyr的用户模式必须要求由MPU。下文讨论的MPU特性都是特指Cortex-M3/M4的,特性如下:
- 支持8个普通region+1个背景region
- 背景region只能在特权级下使用,访问全面地址空间
- 每个普通region可以分为8个子region(目前看zephyr并未使用子region)
- 每个普通region可以单独设置起始地址和大小,和读写可执行属性
- 普通region大小必须是2的幂,最小为32字节
- 非法访问region,或是访问到非region内存区域时会触发__mpu_fault exception
MPU的配置都是通过设置MPU寄存器0xE000ED90~0xE000EDB8完成,这里不做展开说明,如果有需要可以结合代码看arm-v7m中关于MPU寄存器的说明。zephyr中和Cortex M3/4相关的MPU定义代码为:
zephyr/ext/hal/cmsis/Include/core_cm3.h
zephyr/ext/hal/cmsis/Include/core_cm4.h
zephyr/include/arch/arm/cortex_m/mpu/arm_mpu_v7m.h
使用
zephyr在切换到某个线程前通过设置MPU,让线程只能访问限定的内存区域,达到内存保护的目的。
文件路径
下面列出各个技术手段对应的代码路径,主要由MPU功能和CPU模式,特权,堆栈切换配合而成
系统调用
zephyr/include/arch/arm/syscall.h
zephyr/kernel/include/syscall_handler.h
zephyr/arch/arm/core/swap_helper.S
zephyr/arch/arm/core/cortex_m/vector_table.S
zephyr/arch/arm/core/userspace.S
zephyr/scripts/gen_syscalls.py
zephyr/scripts/gen_syscall_header.py
内存保护
zephyr/include/kernel.h
zephyr/ext/hal/cmsis/Include/
zephyr/arch/arm/core/cortex_m/mpu
zephyr/include/app_memory/app_memdomain.h
zephyr/include/app_memory/partitions.h
zephyr/arch/arm/core/thread.c
zephyr/arch/arm/core/cortex_m/reset.S
zephyr/arch/arm/core/userspace.S
zephyr/arch/arm/core/swap_helper.S
zephyr/scripts/gen_priv_stacks.py
内核对象
zephyr/include/kernel.h
zephyr/kernel/userspace_handler.c
zephyr/kernel/mempool.c
zephyr/kernel/各内核对象
zephyr/scripts/gen_kobject_list.py
参考
ARM®v7-M Architecture Reference Manual
ARM® Cortex®-M4 Processor Technical Reference Manual
Cortex-M3 权威指南/The Definitive Guide to the ARM® Cortex-M3