i.MX53 QSB 和 ARM TrustZone
i.MX53 QSB and ARM TrustZone
我正在探索 i.MX53 QSB 和 TrustZone 扩展。多亏了 U-Boot 引导加载程序,我 运行 在安全世界中 OS。现在我在安全的世界里。我有三个问题:
- 第一个问题是我什么时候应该在安全世界和正常世界之间共享内存和中断?
- 第二个是我怎样才能移动到正常世界才能运行成为RichOS呢?
- 第三个问题是监控模式的代码,应该写在哪里呢?它是安全世界中的内核模块吗?
将安全监视器代码视为一种介于安全 OS 和非安全 OS 之间的管理程序。通常它会是一些独立的裸机固件,主要只是将调用和中断发送到安全 OS - 我想从技术上讲它 可以 完全集成到安全 OS,但这会损害可重用性并打开更多安全漏洞的可能性,因此通常强烈建议不要这样做。
监视器代码也应该单独负责世界切换 - 一旦安全 OS 启动并且 运行 它应该调用监视器,设置 SCR.NS并向非安全世界执行异常 return 以启动非安全引导加载程序。
至于在安全和非安全之间共享资源,这完全取决于您想要做什么 - 像软件 TPM 这样相对简单的安全负载可能根本不需要共享资源;诸如全路径内容保护之类的东西涉及在世界之间移交缓冲区和整个设备,并且要复杂得多。
.. when should I share the memory and the interrupts between the secure and normal world ?
内存共享取决于您的系统requirements/design。可以使用 smc
仅使用寄存器来共享信息。没有人可以就内存共享给出一个通用的答案。
共享中断很少有意义。在这两个世界中,您都需要一个 driver。 trustzone 的重点是对硬件进行分区。
一些硬件是 trustzone 感知的。也就是说,它可以根据正在执行的世界更改它的寄存器 set/view。通常,这种硬件只有一个世界的中断或一个单独的中断号。如果您没有 trustzone 感知的设备,尝试这可能是一件愚蠢的事情。
..how can I move to the normal world in order to run a Rich OS on it?
好吧,如果您有监控模式,这就相当简单了。因此,从安全启动(可能是安全 OS task/thread),
- 将正常世界OS载入内存。
- 设置监控模式堆栈和其他上下文;监控模式将需要一个内存缓冲区来存储世界上下文。
- 切换到监控模式。
- 设置内存分区(最初允许正常世界的一切)。
- 更改
NS
位以设置正常世界 CP15.
- 根据引导默认值配置 CP15 寄存器。许多 OSs 会期望他们正常启动。默认情况下,大多数 trustzone CPU 不会设置正常世界 CP15 寄存器。
- 根据需要屏蔽中断、关闭缓存等以启动正常OS.
- 在
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' 将具有正常世界的启动模式(中断屏蔽等)。
注意: 这是一个简单的示例,并不适合您的特定 OS。这只是概念上的。具体取决于特定的 normal/secure 世界 OS 要求。通常,您需要完成引导加载程序在没有 TrustZone 的情况下为 platform/OS 做的所有事情。同样,您需要在所有模式下初始化所有寄存器。您可能不关心安全世界不使用的寄存器 (NEON/VFP) 并将它们保留为引导默认值;对于实际的 'world switch' 代码更是如此。
...concerning the monitor mode code, where should I write it? Is it a kernel module in the secure world?
Monitor mode will always USE the CP15 registers of the secure world。这意味着监控模式具有安全 OS 的 MMU 视图、缓存等。当设置 'NS' 位并且监控模式执行 mcr
或 mrc
时,它正在设置正常的世界寄存器。好吧,从技术上讲,它可能是 'separate' 安全 OS 和监视器之间可能会有很多交互。同样,这取决于具体情况。 OSs(或世界语境)有很多种,
- 轮询模式
- Non-preemptive
- Pre-emptive
您对安全世界和普通世界都有上述排列组合,世界切换处理将取决于两者的要求。对于最复杂的情况 (Pre-emptive secure/normal),您需要集成 OS 依赖的调度程序。
我正在探索 i.MX53 QSB 和 TrustZone 扩展。多亏了 U-Boot 引导加载程序,我 运行 在安全世界中 OS。现在我在安全的世界里。我有三个问题:
- 第一个问题是我什么时候应该在安全世界和正常世界之间共享内存和中断?
- 第二个是我怎样才能移动到正常世界才能运行成为RichOS呢?
- 第三个问题是监控模式的代码,应该写在哪里呢?它是安全世界中的内核模块吗?
将安全监视器代码视为一种介于安全 OS 和非安全 OS 之间的管理程序。通常它会是一些独立的裸机固件,主要只是将调用和中断发送到安全 OS - 我想从技术上讲它 可以 完全集成到安全 OS,但这会损害可重用性并打开更多安全漏洞的可能性,因此通常强烈建议不要这样做。
监视器代码也应该单独负责世界切换 - 一旦安全 OS 启动并且 运行 它应该调用监视器,设置 SCR.NS并向非安全世界执行异常 return 以启动非安全引导加载程序。
至于在安全和非安全之间共享资源,这完全取决于您想要做什么 - 像软件 TPM 这样相对简单的安全负载可能根本不需要共享资源;诸如全路径内容保护之类的东西涉及在世界之间移交缓冲区和整个设备,并且要复杂得多。
.. when should I share the memory and the interrupts between the secure and normal world ?
内存共享取决于您的系统requirements/design。可以使用 smc
仅使用寄存器来共享信息。没有人可以就内存共享给出一个通用的答案。
共享中断很少有意义。在这两个世界中,您都需要一个 driver。 trustzone 的重点是对硬件进行分区。
一些硬件是 trustzone 感知的。也就是说,它可以根据正在执行的世界更改它的寄存器 set/view。通常,这种硬件只有一个世界的中断或一个单独的中断号。如果您没有 trustzone 感知的设备,尝试这可能是一件愚蠢的事情。
..how can I move to the normal world in order to run a Rich OS on it?
好吧,如果您有监控模式,这就相当简单了。因此,从安全启动(可能是安全 OS task/thread),
- 将正常世界OS载入内存。
- 设置监控模式堆栈和其他上下文;监控模式将需要一个内存缓冲区来存储世界上下文。
- 切换到监控模式。
- 设置内存分区(最初允许正常世界的一切)。
- 更改
NS
位以设置正常世界 CP15. - 根据引导默认值配置 CP15 寄存器。许多 OSs 会期望他们正常启动。默认情况下,大多数 trustzone CPU 不会设置正常世界 CP15 寄存器。
- 根据需要屏蔽中断、关闭缓存等以启动正常OS.
- 在
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' 将具有正常世界的启动模式(中断屏蔽等)。
注意: 这是一个简单的示例,并不适合您的特定 OS。这只是概念上的。具体取决于特定的 normal/secure 世界 OS 要求。通常,您需要完成引导加载程序在没有 TrustZone 的情况下为 platform/OS 做的所有事情。同样,您需要在所有模式下初始化所有寄存器。您可能不关心安全世界不使用的寄存器 (NEON/VFP) 并将它们保留为引导默认值;对于实际的 'world switch' 代码更是如此。
...concerning the monitor mode code, where should I write it? Is it a kernel module in the secure world?
Monitor mode will always USE the CP15 registers of the secure world。这意味着监控模式具有安全 OS 的 MMU 视图、缓存等。当设置 'NS' 位并且监控模式执行 mcr
或 mrc
时,它正在设置正常的世界寄存器。好吧,从技术上讲,它可能是 'separate' 安全 OS 和监视器之间可能会有很多交互。同样,这取决于具体情况。 OSs(或世界语境)有很多种,
- 轮询模式
- Non-preemptive
- Pre-emptive
您对安全世界和普通世界都有上述排列组合,世界切换处理将取决于两者的要求。对于最复杂的情况 (Pre-emptive secure/normal),您需要集成 OS 依赖的调度程序。