根据CortexA编程指南
TrustZone硬件还有效地提供了两个虚拟MMU,每个虚拟处理器一个。这使得每个世界都拥有一组本地转换表,其中安全世界映射被隐藏并受到法线世界的保护。
页表描述包括NS位,用于确定是对安全或非安全物理地址空间进行访问。
尽管页表条目位仍然存在,但是普通虚拟处理器硬件不使用此字段,并且始终使用NS = 1进行内存访问。因此,安全虚拟处理器可以访问安全或正常内存。缓存和TLB硬件允许正常和安全条目共存。
那么如果要编写代码(以安全模式运行)来访问说地址0xA0000000 [NS]和0xA0000000 [S]它将如何编码?
答案 0 :(得分:2)
那么如果要编写代码(以安全模式运行)来访问说地址0xA0000000 [NS]和0xA0000000 [S]它将如何编码?
这里有一个概念问题。没有物理地址 0xA0000000 [NS] 和 0xA0000000 [S] ,只有物理地址 0xA0000000 。总线控制器使用NS
位,如HPROT
(用户/主管)访问权限,以检查访问权限上的权限;之后,只有一个物理内存地址存储结果。这样,SDRAM设备不需要知道 TrustZone ,而只需要总线控制器。
您需要设置the partition checker才能拥有全球可共享映射。这是两个世界中的读/写访问。然后,适用scott的信息。如果两个操作系统都有MMU,则创建两个具有相同物理地址的映射。 L1缓存和TLB中可以存在两个存储器和MMU条目的副本。重复的TLB没有问题。写入此存储器后,L1可能需要刷新。将有两行具有相同的数据,但其中一行标有NS
而另一行没有。
Hyperthreading for fun and profit可能是一篇有趣的论文。
答案 1 :(得分:1)
最简单的方法是在安全MMU转换表中设置两个映射,这两个映射都使用物理地址0xA0000000,一个具有NS位设置,另一个复制在另一个具有NS位清除的虚拟地址。然后,安全状态可以使用两个虚拟地址进行不同的访问。
您也可以只使用一个映射并更改NS位,但这需要在每次更改后刷新TLB。