我正在探索 i.MX53 QSB 和 TrustZone 扩展。多亏了 U-Boot 引导加载程序,我在安全的世界中运行操作系统。现在我在安全的世界。我有三个问题:
- 第一个问题是我什么时候应该在安全世界和正常世界之间共享内存和中断?
- 第二个问题是我如何才能转移到正常世界以便在其上运行 Rich OS?
- 第三个问题是关于监控模式的代码,我应该在哪里写呢?它是安全世界中的内核模块吗?
我正在探索 i.MX53 QSB 和 TrustZone 扩展。多亏了 U-Boot 引导加载程序,我在安全的世界中运行操作系统。现在我在安全的世界。我有三个问题:
将安全监视器代码视为一种在安全操作系统和非安全操作系统之间进行调解的管理程序。通常它会是一些独立的裸机固件,主要只是向安全操作系统发送调用和中断——我想从技术上讲,它可以完全集成到安全操作系统中,但这会损害可重用性并开辟更多安全漏洞的可能性,因此通常会强烈反对。
监视器代码也应该单独负责世界切换 - 一旦安全操作系统启动并运行,它应该调用监视器,设置 SCR.NS 并执行异常返回到非安全世界以启动非安全引导加载程序。
至于在安全和非安全之间共享资源,这完全取决于您想要做什么——像软件 TPM 这样相对简单的安全有效负载可能根本不需要共享资源;像全路径内容保护这样的东西涉及在世界之间传递缓冲区和整个设备,而且要复杂得多。
..我什么时候应该分享安全世界和正常世界之间的记忆和中断?
内存共享取决于您的系统要求/设计。可以使用smc
仅使用寄存器来共享信息。没有人可以对内存共享给出一个通用的答案。
共享中断很少有意义。你在两个世界都需要一个驱动程序。trustzone的全部意义在于对硬件进行分区。
一些硬件是trustzone感知的。即,它可以根据正在执行的世界更改它的寄存器集/视图。一般来说,这个硬件只有一个世界的中断或一个单独的中断号。如果您没有可识别 trustzone的设备,那么尝试这可能是一件愚蠢的事情。
..我怎样才能转移到正常世界以在其上运行丰富的操作系统?
好吧,当您有监控模式时,这相当简单。所以,从安全启动(可能是一个安全的操作系统任务/线程),
NS
位以设置普通世界CP15。NS
进行世界切换。世界切换取决于您的系统设计。如果安全世界操作系统仅使用寄存器 R0-R12,则指令可能类似于,
# NS bit is set.
msr spsr_fsxc, lr # mon_lr contains normal world mode, etc.
ldm sp, {r0 - r12, pc}^ # monitor 'sp' is a context pointer.
将ldm rX, {xxx, pc}^
进行模式切换。监视器“sp”可能有 13 个零(对于 r0-r12),然后是“PC”的正常世界入口点。监视器“lr”将具有正常世界的启动模式(中断屏蔽等)。
注意: 这是一个简单的示例,并不适用于您的特定操作系统。它只是概念性的。细节取决于特定的正常/安全世界操作系统要求。通常,您需要在没有 TrustZone 的情况下执行引导加载程序为该平台/操作系统执行的所有操作。同样,您需要在所有模式下初始化所有寄存器。您可能不关心安全世界不使用的寄存器(NEON/VFP),并将它们保留为引导默认值;这对于实际的“世界切换”代码更是如此。
...关于监控模式代码,我应该在哪里写?它是安全世界中的内核模块吗?
监控模式将始终使用安全世界的 CP15 寄存器。这意味着监控模式具有安全操作系统的 MMU 视图、缓存等。当设置了“NS”位并且监控模式执行mcr
ormrc
时,它正在设置正常的世界寄存器。好吧,从技术上讲,它可能是“独立的”,安全操作系统和显示器之间可能会有很多交互。同样,这取决于具体情况。有许多类型的操作系统(或世界上下文),
您对安全世界和正常世界都有上述排列,世界切换处理将取决于两者的要求。对于最复杂的情况(抢先安全/正常),您需要集成依赖于操作系统的调度程序。