Zephyr用户模式-简介

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

本文简要介绍zephyr的user mode

本系列文章结合cortex-m3/m4体系结构介绍说明zephyr user mode的实现,预计分5部分:

  1. 简介(本文): 简要介绍zephyr用户模式,并说明对应保护功能实现用的技术手段
  2. 技术基础:概要说明cortex-m3/m4 和 zephyr 用户模式相关的体系结构知识,并罗列对应文件路径
  3. 系统调用:说明zephyr系统调用的实现和过程
  4. 内核对象:说明zephyr内核对象的检查机制
  5. 内存保护:说明zephyr内存保护的实现

概述

zephyr为提高安全性引入了用户模式线程,用户模式线程类似于Linux的用户进程,被Zephyr视为不受信任,与其他用户模式线程和内核隔离。 有缺陷或恶意的用户模式线程无法访问另一个线程或内核的私有数据,并且不能干扰或控制另一个用户模式线程或内核。

技术手段

内存保护

  1. 线程堆栈
    用户模式线程只能访问自己的堆栈 — 通过MPU实现
  2. 内存域
    用户模式线程可以通过内存域共享内存 — 通过MPU实现
  3. 堆栈保护
    将堆栈底部位置设置为不运行写入访问 — 通过MPU实现

内核对象

  1. 内核对象检查
    Zephyr定义了包括设备驱动在内的一些内核对象,用户模式线程只能在被许可的情况下访问 — 系统调用处理程序进行线程访问合法性检查
  2. 内核对象内存分配
    一些内核对象被使用时(系统调用)需要分配内存,该内存不能被用户模式线程访问 — 线程准备一个内核pool专供系统调用时分配内存

系统调用

  1. 系统调用访问
    用户模式线程访问内核对象必须通过系统调用 — 通过svc进入CPU特权模式实现
  2. 系统调用堆栈
    用户模式线程进入系统调用模式时使用专用的堆栈空间 — 特权模式下切换sp指针

硬件依赖

从技术手段的分析上可以看出要实现用户模式线程主要依赖于

  1. CPU要支援MPU
  2. CPU要支援操作模式(特权模式)

其它的所有技术手段都是通过这二者来实现,因此要从代码上理解user mode,需要先了解你使用CPU体系结构的MPU和操作模式。目前Zephyr也支援一些使用MMU的体系结构,但并未将其作为真正的MMU来用,而是模拟成MPU的行为来使用。因此可以认为目前zephyr在内存保护方面使用的是MPU特性。

参考

https://docs.zephyrproject.org/latest/reference/usermode/index.html