baron · 5 天前

SMMU学习这一篇就够了

目录
前言
1、SMMU总结
1.1、SMMU的timeline
1.2、SMMU的简介
1.3、为什么要使用SMMU?

  1. SMMU原理解读
    2.1. SMMU的使用模型
    2.2. SMMU的硬件原理图
    2.3. StreamID
    2.4 STE Table 和 STE format
    2.4.1 一个 Linear Stream Table的示例
    2.4.2 一个 2-level Stream Table 的示例
    2.4.3 Multi-level Stream and CD tables
    2.4.4 Translation stages and addresses
    2.4.5 Configuration and translation lookup sequence
    2.4 寄存器的介绍
    2.5 Stream Table Entry
    2.6 Context Descriptor table
  2. 总结
    推荐

本文转自 周贺贺,baron,代码改变世界ctw,Arm精选, 资深安全架构专家,11年手机安全/SOC底层安全开发经验。擅长trustzone/tee安全产品的设计和开发。
前言
最近朋友圈、微信群(ARM-Trustzone-TEE-AT)掀起一阵学习SMMU的热潮,作为一名安全领域的渣渣 ,势必要蹭一蹭这个“热点”,也学习一下吧,反正早晚都要学,因为它和安全的关系还是比较大的。学习是一件长期的过程,本文就先简单理一下概念吧。

1、SMMU总结
1.1、SMMU的timeline
55781ffe94fdcda8dc32c8326882dfc0.png
1.2、SMMU的简介
SMMU的全称是System Memory Management Units, 它属于Arm的System IP, 主要给其他Master来使用,其连页表格式和Core MMU是一样的,理论上可以让Core的MMU和SMMU使用同一套页表.

那么SMMU都是用在哪些地方呢?*以下展示了一个usecase,来自arm官方博客(February 17, 2014),也是比较早期的一个Sample case
042558a6b90dbbfbc80f7e0cc753eb65.png
1.3、为什么要使用SMMU?

  • 访问非连续的地址

现在系统中很少再预留连续的memory,如果Master需要很多memory,可以通过SMMU把一些非连续的PA映射到连续的VA,例如给DMA,VPU,DPU使用。

  • 32位转换成64位

现在很多系统是64位的,但是有些Master还是32位的,只能访问低4GB空间,如果访问更大的地址空间需要软硬件参与交换memory,实现起来比较复杂,也可以通过SMMU来解决,Master发出来的32位的地址,通过SMMU转换成64位,就很容易访问高地址空间。

  • 限制Master的访问空间

Master理论上可以访问所有的地址空间,可以通过SMMU来对Master的访问进行过滤,只让Master访问受限的区域,那这个区域也可以通过CPU对SMMU建立页表时动态控制。

  • 用户态驱动

现在我们也看到很多系统把设备驱动做在用户态,调用驱动时不需要在切换到内核态,但是存在一些安全隐患,就是用户态直接控制驱动,有可能访问到内核空间,这种情况下也可以用SMMU来实现限制设备的访问空间

  • 设备虚拟化

例如设备虚拟化有多种方式,Emulate,Para-virtualized,以及Pass-through,用SMMU可以实现Pass though,这样无论是性能,还是软件的改动都是比较小的。

一些不支持TrustZone的Master,可以利用SMMU支持Trustzone

  1. SMMU原理解读
    2.1. SMMU的使用模型
    SMMU全称System Memory Management Unit,其实SMMU和MMU具有同样的作用,区别是供给Master使用,同样提供页表转换工作,Master可通过页表转换访问物理地址,达到Master一样使用虚拟地址
    5e9226427339005b7a20e9e17740d890.png
    官方给出的示例图如下所示:
    6775a087b6603b7e396643ab2d094396.png
    示例图2:
    73e01b0c600a578dfe74787fadeea4c7.png
    2.2. SMMU的硬件原理图
    学过MMU的人都知道,MMU是由 TLB + Address Translation, 那么对于SMMU呢?
    它是由TBU + TCU组成,其中TBU中含有TLB, TCU缓存地址翻译。
    DTI则是SMMU内部的连接总线的协议。
    ecf4cbffbf0f64f26f67970d7f9f469a.png
    而一个SMMU中可以放置多个ACE-Lite TBU模块,也可以放置LTI TBU
    562c7195ac5f255b9d60dc38b2f4aa15.png
    TBU原理图
    e1c9f4c3d16159803e9e3370e1395973.png
    LTI TBU的原理图97b70724cd2df86bda03d4b02ff83a8e.png
    TCU的原理图
    abf3e2f5b15da4614d5edf897c2015be.png
    2.3. StreamID
    2.4 STE Table 和 STE format
    STE Table 分为Linear Stream Table和mutil-level Stream Table,这是由于STRTAB_BASE_CFG中的比特位配置

2.4.1 一个 Linear Stream Table的示例
这种查询方式很简单,根据streamID的数值,直接查询到对应的STE(streamID entry)
7c68470a3df3709f0fa5e640e241e904.png
2.4.2 一个 2-level Stream Table 的示例
ed7152653b3168e9361d11dfee700e06.png
c1716654fb0fda8aafd29662eb5f6b58.png
2.4.3 Multi-level Stream and CD tables
而事实上,一个STE,又可以对应多个Context Descriptor
7b6f2927fb41333c5355bdfbbca3a76f.png
这里小小总结一下: 这里的一个Context Descriptor 就相当于 MMU系统中的 TTBRx + TCR寄存器。
这里Stage 1 Transslation tables的格式和MMU页表的格式一致。

2.4.4 Translation stages and addresses
地址翻译也是份stage1和stage2的,这和MMU也是一致的。
dac3505a1ecbbc7dfd92df4d39eb2822.png
2.4.5 Configuration and translation lookup sequence
SMMU地址翻译的原理或数据里如下图所示,这是在学习MMU的时候未曾见过的那么细致的图。
f4490e334c99c127be254ad7c345cd56.png
2.4 寄存器的介绍
SMMU寄存器都是memory-map的e2dfc9fea3e24b653e950b7027b0f841.png
SMMU里有两套寄存器,一套是给安全master用的,一套是给非安全master用的。
其实就相当于有两个SMMU了。如下我也列举了几个特别的寄存器,带S的是给安全用的,不带S的是给非安全用的。所以,硬件仅仅有一块SMMU,但从软件的视角来看,有两块SMMU

  • SMMU_STRTAB_BASE
  • SMMU_S_STRTAB_BASE
  • SMMU_STRTAB_BASE_CFG
  • SMMU_S_STRTAB_BASE_CFG

2.5 Stream Table Entry
0d2022b927e75f2dac67a34d973c634a.png
2.6 Context Descriptor table
可以看出,这里的Context Descriptor 就有点类似于MMU里的 TTBRx + TCR寄存器的味道
0d2022b927e75f2dac67a34d973c634a.png

  1. 总结
    (1)MMU 只能给 一个core用。而SMMU想给多个master用,多个master又对应不同的表。所以就搞了个STE。每一个STE entry里,都可以指向多个context descriptor (我觉得一般也就只用一个吧),然后每一个context descriptor 就相当于 MMU的TTBRx + TCR寄存器。 context Descriptor之后,就和普通的MMU一样
    (2)SMMU里有两套寄存器,一套是给安全master用的,一套是给非安全master用的。从软件视角来看,其实就相当于有两个SMMU了。但这不是banked,他们的寄存器名字不一样,一类带了S,一类不带S。而且寄存器memory-map的地址还不一样。
    (3)SMMU又有Secure STE 和 Non-secure STE的概念, Secure STE 后面的页表/地址转换,可以转secure memory,也可以转non-secure memory。Non-Secure STE 后面的页表/地址转换,只可以转non-secure memory。 这和MMU里的Descriptor里的NS比特也是一样的。
    推荐
  • ARMv8/ARMv9架构从入门到精通 --博客专栏
  • 《Armv8/Armv9架构从入门到精通 第二期》 --大课程
  • 8天入门ARM架构 --入门课程
    💋💋💋相关课程介绍:学好ARM让领导刮目相看《Armv8/Armv9架构从入门到精通(三期)》💋💋💋

🌍咨询vx : sami01_2023

推荐阅读
关注数
9491
文章数
257
vx: coding_the_world
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息