Zephyr用户模式-技术基础

Creative Commons
本作品采用知识共享署名

本文说明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状态的对应如下:
zephyrstatus

MPU

作用

MPU可通配置不同内存地址区域(region)的访问属性达到提高系统的安全性的目的:

  • 阻止用户应用程序破坏操作系统使用的数据
  • 阻止一个任务访问其它任务的数据区(任务隔开)。
  • 可以把关键数据区设置为只读(数据保护)。
  • 检测意外的存储访问(堆栈溢出)。

特性

Cortex M3/4的MPU可选配,要使用Zephyr的用户模式必须要求由MPU。下文讨论的MPU特性都是特指Cortex-M3/M4的,特性如下:

  1. 支持8个普通region+1个背景region
  2. 背景region只能在特权级下使用,访问全面地址空间
  3. 每个普通region可以分为8个子region(目前看zephyr并未使用子region)
  4. 每个普通region可以单独设置起始地址和大小,和读写可执行属性
  5. 普通region大小必须是2的幂,最小为32字节
  6. 非法访问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