您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > Trustzone技术细节
1.Trustzone硬件划分每个物理的处理器核提供两个虚拟核,一个是非安全核(Non-secure,NS),另一个是安全核(Secure,S),arm体系保证了很多硬件资源都是双份的,每个虚拟核独享自己的那份资源,大大简化了软件设计。在这二者之间切换的机制叫做monitor模式。NS核只能访问NS的系统资源,而安全核能访问所有资源。普通世界的软件可以使用SMC指令或者通过硬件异常机制的一个子集来进入到monitor模式,从而获取安全世界的服务。普通世界只能获取安全世界的服务,要想拿到点其他东西,就连门都没有了。CP15的SCR寄存器中有一个NS位代表了当前cpu所处的世界,NS=0表示安全世界,只有安全世界能修改SCR寄存器,另外,monitor模式下总是安全世界。3.trustzone和MMU安全世界和普通世界都有自己的虚拟MMU,实际上只是两个世界都有一份TTBR0、TTBR1、TTBCR,也就是会有两个MMU表。但TLB是共享的,在TLB里面会对安全世界的TLB项打上tag,所以实际上一个TLB也是逻辑上被划分了两个,不同世界各管各的。另外TLB对不同世界的项打上Tag也不是必须的,不同SoC可以不一定实现这个功能,毕竟转换世界的时候刷出整个TLB就可以了。MMU表里的描述符里也会有一个NS位,对于普通世界,处理器做地址转换的时候无视这个位,对于安全世界,处理器做地址转换的时候按照描述符里的NS位来确定地址转换的物理地址空间,NS=0的时候是按照安全世界的物理空间来做地址转换的,反之就是按安全世界的物理空间来做地址转换的。这里会有疑问,什么是安全世界的物理地址空间和普通世界的物理地址空间?看起来安全世界可以访问所有资源,怎么还是普通世界访问MMU表时无视里面的NS位?这两个问题是相关的,首先要明白对资源的保护可不是通过MMU表里的NS位,而且TZASC和TZPC来做保护。划分为安全世界的物理地址空间和普通世界的物理地址空间,并不是说两个地址空间的内存map不一样,而是说同一个物理地址实际上被打上了安全和普通的两个“烙印”,这个“烙印”是对cache和TLB而言的(特别是cache),也就是说安全世界和普通世界访问同一个物理内存地址的内容,最后在cache里是有两份的。假设两个世界共享某一块内存用来做交互,如果普通世界更新了一些内容,这些内容暂时还在cache里,这时候安全世界如果以安全世界的身份来访问这块内容的话,访问的是cache里安全世界自己的东西,这就有可能导致cache不一致。所以安全世界也以普通世界的身份来访问的话,那样就能保证cache的一致。另外,对普通世界而言,描述符的NS位确实没有意义,因为它只能访问普通世界的资源。TLB(TranslationLookasideBuffer)传输后备缓冲器用以加快虚拟地址到物理地址的转换速度的缓存。5.trustzone和中断中断也是隔离的,安全世界和普通世界有独立的VBAR寄存器,中断向量表。唯独monitor模式下有自己的中断向量表,寄存器是MVBAR,smc指令就是跳到这个向量表。GIC可以配置某个中断号属于安全世界还是普通世界的,有关GIC的安全的配置只有安全世界下才有权限配置。通常,IRQ会被配置成普通世界的中断源,而FIQ配成安全世界的,这是因为ARM上的操作系统比如Linux只用IRQ。当中断来的时候,如果该中断属于当前世界,那么中断就在当前世界处理了,如果不属于,那么会触发切换到monitor模式,monitor模式的代码需要考虑是不是切换到另外的世界来处理中断或是丢弃该中断。CPSR里面的F和A位是用来maskFIQ和externalabort中断的,普通世界能不能修改两个bit也是安全世界说了算,SCR里面有禁止这两个bit被安全世界修改的位。6.trustzone的物理内存和外设保护Trustzone需要物理内存和外设在两个世界之间的隔离,这是安全世界真正在意的东西---因为你所要保护的信息和内容就在内存里或是经过某些外设。物理内存和外设的隔离保护通过TZASC和TZPC的设置来达到目的。TZASC可以把物理内存分成多个区域,每个区域的访问权限可以灵活配置为安全区域或是非安全区域,甚至可以配置成只有普通世界可以访问。TZPC则是配置不同的外设属于哪个世界。当然了TZASC和TZPC的配置只能在安全世界下进行。7.trustzone和多核比如四核的soc,每个核都可以配成两个虚拟核,那么总共会有8个世界。虽然cache一致性、中断处理等机制硬件层都尽量避免不同世界互相干扰。但是在系统软件设计上,cache的一致性,多核之间的普通世界和安全世界之间的状态管理和同步都需要精心设计。如果使用的场景不复杂,最好就配置安全世界只在一个核上运行,所有其他核上的请求都经过这个核最终产生请求,这样简可以简化软件设计,增加系统的可靠性和稳定性。8.trustzone和ACPACP(AcceleratorCoherencePort)作为AXIslaveinterface,也带有安全属性,比如某个PCIe是连到ACP端口的,如果PCIe是配置为属于普通世界的,那么ACP产生的事务也是non-secure的,这时候打个比方说ACP的作用region是DDR的区域0-128M,那么0-128M必须配置为属于普通世界,或者说可以把linux的DMAzone配置在128M以内,并把这个DMA区域配置为属于普通世界,否则ACP功能就没法用了。总结,soc启动的时候就开始工作在secure世界,secure启动代码需要做所有的安全方面的初始化和资源配置,并load安全内核和普通世界代码(比如Linux),由于硬件单元的支持,理论上现有的普通世界操作系统代码不需要修改或者很少修改就能正常工作,唯一欠缺的是一个通过安全世界的驱动程序。TrustZone技术中,TEE系统代码开发才是大头,现有的开源项目如openvirtualization以及Op-Tee可以提供不少参考。另外,TEE技术还需要比较重要的一环就是secureboot,这是整个系统的rootofsecure,从上电boot就保证要启动的image没被篡改,从而从根本上保证系统的安全性。那又是另外一个话题了。
本文标题:Trustzone技术细节
链接地址:https://www.777doc.com/doc-2863767 .html