2

我正在使用带有 A9 处理器(双核)的 zynq-7000(zed 板)。我正在尝试与 Trustzone 合作。

我想将 cpu1 配置为仅在安全世界中运行,并将 cpu0 配置为运行普通世界应用程序 (petalinux)。我阅读了 ug1019 和其他一些文档,但我不知道如何实现这一点。我找到了这个,

MRC p15,0,<Rt>,c1,c1,0 ; Read SCR into Rt

MCR p15,0,<Rt>,c1,c1,0 ; Write Rt to SCR

我可以在哪里配置 NS 位,但我不确定它是否会工作,它会将哪个 cpu 置于安全/非安全状态。如果有人可以指导我一些例子或想法。

4

1 回答 1

2

我想将 cpu1 配置为仅在安全世界中运行,并将 cpu0 配置为运行普通世界应用程序 (petalinux)。

通常 CPU0 是引导 CPU,您需要在引导期间启动 CPU1。通常无需执行任何操作即可以安全模式启动。所以我认为需要在 CPU0 启动期间的步骤是,

  • 在安全/正常世界之间划分内存。
  • 创建监视器向量/代码来处理正常的世界请求。
  • 以安全模式启动 CPU1。
  • 在正常世界中启动 petalinux

您需要防止正常世界访问安全世界中的内存(或者这没有什么意义)。这可以包括安全世界所需的设备。

Linux 需要更新一些只能通过安全世界访问的寄存器。例如,cache-l2x0需要写入一些仅安全寄存器。您最终需要使用SMC指令来更改 CP0 上的世界,以获得更改这些寄存器的权限,然后在正常世界中返回 Linux。如果您希望在 CPU0 和 CPU1 Linux 之间进行通信,SMC 也很有用。

您可能必须打开早期引导调试才能找到 Linux 可能需要安全访问的所有问题。部分原因可能是 Zync 系统上的驱动程序和安全/正常世界问题。其他问题是存储的普通世界 CP15 寄存器在启动时通常是垃圾,而安全存储的寄存器具有已知值。

您还需要使用在分区内存步骤中所做的任何更改来更改设备树。例如,您可能希望定时器等在 CPU1 上有一个 RTOS。Linux 显然不能使用这些。

正常世界中的引导 petalinux需要就像uboot 提供的一样。


于 2019-09-02T13:50:56.313 回答