Zephyr用户模式-技术基础
本文说明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