内存保护
1 背景与基本原理
内存保护(Memory protection)只能在为内存保护提供硬件支持的处理器上实现。比如硬件上MPU(MemoryProtectionUnits)功能的芯片。
内存保护方案基于可执行程序的(data、code和stack)区域。
Stack: 一个OS-Application由若干个对象(Task和ISR)组成,根据定义,栈(Stack)是只属于这些对象(Object)自己本身的,因此不需要在对象间共享数据,即使这些对象属于同一个OS-Application。
对于任务和中断的栈的保护是非常有用的,主要有两个原因:
- 与栈监测(stack monitoring)功能相比,为任务和中断提供更即时的栈溢出(包括上溢和下溢)检测。
- 提供OS-Application之间的保护,例如满足某些安全约束。
Data: OS-Application有自己的私有数据(Data)区,任务和中断也有自己的私有数据区,OS-Application的私有数据部分被属于它的任务和中断所共享。
Code: 代码(Code)段要么是OS-Application的私有部分,要么可以在所有的OS-Application之间共享(使用共享库)。在不使用代码段保护的情况下,执行不正确的代码将导致内存、时序或服务冲突。
2 需求
即规范要求哪些内容需要保护。
数据区和栈
(1)OS应防止不可信的OS-Application对自己的数据区和栈区(即内核的数据和栈)进行写访问。
(2)OS应提供一种选择,是否限制可信OS-Application的写访问,其方式与限制不可信OS-Application的方式相同。
可以通过设置一个OsTrustedApplicationWithProtection配置项进行选择。
OS-Application的私有数据
(1)OS可能会阻止其他不可信OS-Application尝试读取一个OS-Application的数据区。
(2)OS应允许OS-Application对自己的私有数据进行读写访问。
(3)OS应防止其他不可信OS-Application对一个OS-Application的私有数据进行写访问。
中断/任务的私有栈
(1)OS应允许任务/2类中断对自己的私有栈进行写访问。
(2)OS可以防止不可信OS-Application中的任务/2类中断的私有栈被同一OS-Application下的其他任务/2类中断对其进行写访问。
(3)OS应该防止其他不可信的OS-Application对一个OS-Application中的任务/2类中断的私有栈进行写访问。
中断/任务的私有数据
(1)OS应允许任务/2类中断对自己的私有数据区进行写访问。
(2)OS可以防止不可信OS-Application中的任务/2类中断的私有数据区被同一OS-Application下的其他任务/2类中断对其进行写访问。
(3)OS应该防止其他不可信的OS-Application对一个OS-Application中的任务/2类中断的私有数据区进行写访问。
代码区
(1)OS可以提供一种保护能力,保护一个OS-Application的代码段不被不可信OS-Application执行。
(2)OS应该可以对所有OS-Application都可执行的代码区提供共享代码库。
外设
(1)如果OsTrustedApplicationWithProtection == FALSE,则OS应允许可信OS-Application对外设进行读写访问。
(2)OS应允许不可信OS-Application仅向非配给它的外设写入数据(包括一些可以引起写内存区域的读操作)。
触发内存访问错误
如果检测到内存访问错误,OS应调用Protection Hook接口,其错误码为E_OS_PROTECTION_MEMORY。