我探索的i.MX53 QSB集和TrustZone扩展。 我运行安全世界感谢的U-Boot引导程序在操作系统中。 现在,我在安全世界。 我有三个问题:
- 第一个问题是,当我应该共享存储和安全和正常世界的中断?
- 第二个是我怎么能转移到正常的世界,以在其上运行一个丰富的操作系统?
- 第三个问题涉及到监控模式的代码,我应该在哪里写呢? 它是在安全世界中一个内核模块?
我探索的i.MX53 QSB集和TrustZone扩展。 我运行安全世界感谢的U-Boot引导程序在操作系统中。 现在,我在安全世界。 我有三个问题:
..我的时候应该共享存储和安全和正常世界的中断?
内存共享取决于您的系统要求/设计。 它可以使用smc
只使用寄存器来共享信息。 没有人能给出内存共享一个通用的答案。
它很少是有道理的共享中断。 您需要在两个世界的驱动器。 TrustZone的整点是分区的硬件。
一些硬件的TrustZone知道。 也就是说,它可以改变它的寄存器设置基于什么世界正在执行/视图。 一般情况下,该硬件只有一个世界还是一个独立的中断号中断。 如果你没有被察觉的TrustZone的设备,这可能是尝试一件愚蠢的事情。
..how我可以移动到正常的世界,以在其上运行一个丰富的操作系统?
那么,当你有一个监控模式,这是相当简单的。 因此,从安全启动(可能是安全的操作系统任务/线程),
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”可能有(为R0-R12)13个零,然后一个正常的世界切入点“PC”。 监视器“LR”将有启动模式(中断屏蔽等)为正常的世界。
注意:这是一个简单的例子,这并不意味着您的特定的操作系统。 这只是概念上的。 具体情况取决于特定的正常/安全的世界的操作系统要求。 通常情况下,你需要做的所有事情的引导加载器会为没有的TrustZone该平台/ OS做。 同时,你需要初始化所有的寄存器中的所有模式。 你可能不关心寄存器安全世界中不使用(NEON / VFP),让他们按开机默认值; 这是实际的“世界开关”的代码更真实。
关于监控模式的代码......,我应该在哪里写呢? 它是在安全世界中一个内核模块?
监控模式,会始终使用安全的世界的CP15寄存器 。 这意味着监控模式有MMU视图,缓存,安全操作系统等。 当“NS”位和监控模式做了mcr
或mrc
,它被设置在正常的世界寄存器。 那么,在技术上也可能是“独立”的时候,可能会有很多安全OS和监视器之间的相互作用。 再次,这取决于具体情况。 有许多类型的操作系统(或世界环境)的,
你有以上的安全和正常的世界,世界的开关操作两个置换将取决于双方的要求。 对于最复杂的情况下(先发制人的安全/正常),你需要调度的整合这取决于操作系统。
想想安全监控代码作为一种管理程序的安全操作系统和非安全的操作系统之间起中介作用的。 通常,这将是一些独立的裸机固件其中大多只是分派调用和中断的安全操作系统-我想在技术上它可以完全由整体到安全的操作系统,但伤害了可重用性和开辟了更为安全漏洞的可能性,所以一般会强烈反对。
监视器代码也应该是什么世界切换全权负责 - 一旦安全操作系统启动并运行它应该调用到显示器,这台SCR.NS并执行了异常返回到非安全世界揭开序幕非安全启动。
至于安全和非安全之间的资源共享,这是完全下降到你想做的事 - 就像一个软件TPM可能根本不需要共享资源相对简单安全有效载荷; 像全路径内容保护涉及换手缓冲器和世界之间整个设备和复杂得多。