按照CortexA编指南
TrustZone硬件还有效地提供了两个虚拟MMU,每个虚拟处理器一个。 这使得每个世界都有一个本地的翻译表,安全的世界映射被隐藏起来,并被保护在正常世界之外。
页表描述包括一个NS位,用于确定是否访问安全或非安全的物理地址空间。
尽pipe页表入口位仍然存在,但是普通虚拟处理器硬件不使用此字段,并且内存访问始终以NS = 1进行。安全虚拟处理器因此可以访问安全或正常内存。 高速caching和TLB硬件允许正常和安全条目共存。
所以如果一个代码(以安全模式运行)被写入访问说地址0xA0000000 [NS]和0xA0000000 [S]将如何编码?
所以如果一个代码(以安全模式运行)被写入访问说地址0xA0000000 [NS]和0xA0000000 [S]将如何编码?
这里可能有一个概念性的问题。 没有物理地址0xA0000000 [NS]和0xA0000000 [S] ,只有物理地址0xA0000000 。 总线控制器使用NS
位,例如HPROT
(用户/主管)访问权来检查访问权限 ; 之后,只有一个物理内存地址存储结果。 这样,SDRAM设备不需要TrustZone感知,而只需要总线控制器。
您需要设置分区检查器以拥有可共享的映射。 这是两个世界的读/写访问。 那么斯科特给出的信息适用。 如果两个操作系统都有一个MMU,则创建两个具有相同物理地址的映射。 内存和MMU条目的两个副本可能存在于L1缓存和TLB中。 重复的TLB没有问题。 写入这个内存之后,L1可能需要刷新。 将有两条线都具有相同的数据,但一个标有NS
和一个没有。
超线程的乐趣和利润可能是一个有趣的文件在这方面。
最简单的方法是在安全MMU转换表中设置两个映射,这两个映射都使用物理地址0xA0000000,一个NS位已设置,另一个拷贝位于NS位清零的不同虚拟地址。 然后,安全状态可以使用这两个虚拟地址来进行不同的访问。
您也可以只使用一个映射并更改NS位,但是这需要在每次更改后刷新TLB。