baron · 3月22日 · 四川

REE刷TLB时会把安全的TLB刷掉吗

快速连接

👉👉👉【精选】ARMv8/ARMv9架构入门到精通-目录 👈👈👈


 title=
思考:
REE刷TLB时会把安全的TLB刷掉吗?
TEE刷TLB时能否刷安全的TLB?例如页表管理着的共享内存,它的翻译缓存到了TLB.

首先,纠正一下用词,这里的"刷",来自某些操作系统中的"flush",在TLB底层的操作指令中,是没有flush或clean的,关于TLB的操作指令指令只有一类,那就是invalidate。 博文在以下的描述中,可能会invalidate/刷交替使用。

接着我们再衍生几个讨论,在EL1是否能invalidate all TLB,或是否能invalidate EL3 TLB ?
答案,当然是不能的,因为你仔细看看TLBI的每一条指令,是没有ALL(EL1/EL2/EL3)的,当然每一条指令都跟上了一个Exception Levle范围的。
所以总结一下就是:PE在EL1时可以刷EL1的TLB,但不可以刷EL2/3的TLB,而PE在EL3时可以刷EL3/2/1的TLB

在这里插入图片描述

那么在EL3时,是如何刷S-EL1的TLB,如何刷NS-EL1的TLB呢?
回答是,你使用的指令,要跟上EL1的限定,如TLBI xxxxE1,然后记得切换SCR_EL3.NS比特来决定刷的S还是NS的TLB

接下来,重点来了,REE刷TLB时会把安全的TLB刷掉吗?
答案:当然不会!!你看具体指令的解释,如TLBI VAE1指令,最后是说作用的这个entry必须得是VA using the EL1&0 translation regime for the Security state, 用白话解释就是该entry必须是虚拟地址所在的那个安全状态的Translation regime,再白话一点就是刷cache这条指令后面跟着的虚拟地址VA是在哪个系统的,就是刷哪个系统所对应的安全状态的TLB。
在这里插入图片描述
如果以上你看着还是比较绕,那么我们可以从伪代码中进一步确认我们上述的结果,注我们只看EL1的,不考虑Hypervisor的开启情况。从下面的伪代码我们也可以看到在执行TLBI_VA的时候,传入的参数是有SecurityStateAtEL(EL1)的,即刷的就是当前PE所在安全状态的EL1的TLB
在这里插入图片描述

从以上的分析中,REE只能刷REE的TLB,TEE只能刷TEE的TLB,EL3可以刷REE的TLB,EL3也可以刷TEE的TLB。 那如果是TEE管理着的共享内存的地址翻译(该地址为non secure PA),缓存到了TLB,在TEE侧能否刷这些TLB entry呢?
当然是可以刷的,因为即使是地址翻译对应的是non secure PA, 只要是在TEE进行的地址翻译,使用的就是Secure Translation Regime,缓存到TLB entry中的NS就是0 。 白话说一下,不管你是安全地址还是非安全地址,只要是在TEE侧产生的翻译,你就是安全的TLB条目。 所以如果是TEE管理着的共享内存的地址翻译(该地址为non secure PA)缓存到了TLB,该条目也是可以在TEE侧刷的。


以上总结完了,最后我们也在批判点别的东西,如以下chatgpt的回答就是错误的。
在这里插入图片描述


关注"Arm精选"公众号,备注进ARM交流讨论区。
图片1.png

推荐阅读
关注数
9442
内容数
191
以易懂、渐进、有序的方式,深入探讨ARMv8/ARMv9架构的核心概念。我们将从基础知识开始,逐步深入,覆盖最新的架构,不再纠缠于过时技术。本系列内容包含但不限于ARM基础、SOC芯片基础、Trustzone、gic、异常和中断、AMBA、Cache、MMU等内容,并将持续更新。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息