我正在探索i.MX53 QSB和TrustZone扩展。由于U-Boot引导加载程序,我在安全的世界中运行操作系统。现在我处在安全的世界里。我有三个问题:
答案 0 :(得分:2)
将安全监控代码视为一种在安全操作系统和非安全操作系统之间进行调解的虚拟机管理程序。通常情况下,它会是一些独立的裸机固件,主要是调度安全操作系统的调用和中断 - 我认为技术上它可以完全与安全操作系统集成,但这会损害可重用性并打开可能存在更多安全漏洞,因此通常会强烈反对。
监控代码也应该是世界转换的全部责任 - 一旦安全操作系统启动并运行,它应该调用监视器,监视器设置SCR.NS并执行异常返回到非安全世界启动非安全引导程序。
至于在安全和非安全之间共享资源,这完全取决于您想要做的事情 - 像软件TPM这样的相对简单的安全负载可能根本不需要共享资源;像全路径内容保护这样的事情涉及在世界之间切换缓冲区和整个设备,并且要复杂得多。
答案 1 :(得分:1)
..我应该何时共享内存和安全与正常世界之间的中断?
内存共享取决于您的系统要求/设计。可以使用smc
仅使用寄存器来共享信息。没人能给出关于记忆共享的通用答案。
共享中断很少有意义。在这两个世界中你都需要一个驱动程序。 trustzone 的重点是分区硬件。
某些硬件 trustzone 知道。即,它可以根据正在执行的世界改变它的寄存器组/视图。通常,此硬件仅具有一个世界的中断或单独的中断号。如果您没有 trustzone 知道的设备,这可能是一个愚蠢的尝试。
..为了在其上运行Rich OS,我怎样才能进入正常世界?
嗯,当你有一个监控模式时,这很简单。因此,从安全启动(可能是安全的OS任务/线程),
NS
位更改为设置普通世界 CP15 。NS
位仍然设置时,请进行世界切换。世界开关取决于您的系统设计。如果安全世界OS仅使用寄存器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),并按照启动默认值保留它们;对于实际的世界开关来说更是如此。代码。
...关于监控模式代码,我应该在哪里写呢?它是安全世界中的内核模块吗?
Monitor mode will always USE the CP15 registers of the secure world。这意味着监控模式具有安全OS的MMU视图,缓存等。当' NS'位已设置且监控模式执行mcr
或mrc
,它正在设置正常世界寄存器。嗯,从技术上讲,它可以分开'安全操作系统和监视器之间可能会有很多交互。同样,这取决于细节。有许多类型的操作系统(或世界环境),
您对安全和正常世界都有上述排列,世界开关处理将取决于两者的要求。对于最复杂的情况(抢先安全/正常),您需要集成与操作系统相关的调度程序。