Secure/Non-secure/ASID/ nG
- 一,MMU 控制机制核心:NS 和 NSTable 位
- 二,nG 和ASID的基本概念
- **ASID 与 nG 位的适用范围和限制**,尤其是在不同的地址转换阶段(Stage 1 和 Stage 2)以及安全状态(Secure/Non-secure)下的行为
- 原文: ** ASIDs are supported only when stage 1 translations can support two VA ranges.**
- 原文: **Stage 2 translations, and stage 1 translations that can support only a single VA range do not support ASIDs, and all descriptors in these regimes are treated as global.**
- 原文: **In a translation regime that supports global and non-global translations, translation table entries from lookup levels other than the final level of lookup are treated as being non-global, regardless of the value of the nG bit.**
- 原文: **When a PE is using the VMSAv8-64 translation table format, and is in Secure state, a translation must be treated as non-global, regardless of the value of the nG bit, if NSTable is set to 1 at any level of the translation table walk.**
- **在支持 ASID 和 nG 的 ARMv8 架构中,不同进程可以将同一个虚拟地址映射到不同的物理地址**。
- 如果只设置 **ASID** 或只设置 **nG**,会发生什么情况
ARMv8-A 架构定义了两种安全状态:
- Secure 状态:处理器可以访问 Secure 和 Non-secure 的物理地址空间。
- Non-secure 状态:处理器只能访问 Non-secure 的物理地址空间,无法访问 Secure 系统控制资源
这就引出一个问题,如何划分Secure 和 Non-secure 的物理地址空间?同样是一段物理空间,处理器怎么知道它是secure的还是non-secure的?
除了TZASC这种硬件控制方式外,我们最常用,最普遍的方式就是使用MMU,通过软件配置pagetable,实现Secure 和 Non-secure 的物理地址空间的定义和划分。
TrustZone Address Space Controller (TZASC) 是一个硬件模块,主要用于:
- 划分物理地址空间为 Secure 和 Non-secure 区域。
- 控制访问权限:根据访问请求中的 NS(Non-secure)位,决定是否允许访问某段物理地址。
- 配置方式:通常由 Secure World 的软件(如 Secure Monitor 或 TrustZone OS)进行初始化和配置。
一,MMU 控制机制核心:NS 和 NSTable 位
在 ARM 的虚拟内存系统架构(VMSA)中,Secure 与 Non-secure 内存访问的控制主要依赖于以下两个位:
1. NS(Non-secure)位
- Secure 状态访问:如果翻译表条目来自 Secure 内存,NS 位决定访问的是 Secure 还是 Non-secure 内存。
- Non-secure 状态访问:忽略 NS 位。
- 作用范围:NS 位仅影响由描述符定义的输出地址对应的内存块或页面。
MMU 的行为依赖于处理器当前的 Exception Level(EL) 和 Security State:
| 状态 | 使用的地址转换机制 | 是否支持 NS 控制 |
|---|---|---|
| Secure EL1/EL0 | Secure PL1&0 stage 1 | ✅ 支持 NS bit |
| Non-secure EL1/EL0 | Non-secure PL1&0 stage 1 + stage 2 | ❌ 忽略 NS bit |
| Non-secure EL2 | Non-secure EL2 stage 1 | ❌ 忽略 NS bit |
2. NSTable 位
-
指示描述符所引用的page table是否位于 Secure 或 Non-secure 内存中。
-
Secure 状态访问:
NSTable == 0:表地址在 Secure 地址空间,NS 和 NSTable 位有效。NSTable == 1:表地址在 Non-secure 地址空间,NS 和 NSTable 位被忽略。
-
Non-secure 状态访问:始终忽略 NS 和 NSTable 位
-
如果某一层级的 NSTable == 1,则该层级之后的所有 NS 和 NSTable 位都将被忽略,后续访问都视为 Non-secure。
-
这是一种 层级控制机制,用于在 translation table walk 中逐步决定访问的安全性。
3. 各种翻译表格式下的控制方式
1 VMSAv8-64 格式
- NS 和 NSTable 位仅在 Secure 状态下有效,且描述符必须从 Secure 内存中获取。
- Non-secure 状态下的访问忽略这些位。
2 VMSAv8-32 Long-descriptor 格式
- 与 VMSAv8-64 类似,NS 和 NSTable 位仅在 Secure 状态下有效。
- Non-secure 状态下忽略这些位。
3 VMSAv8-32 Short-descriptor 格式
- NS 位仅在一级翻译表中定义。
- 描述符定义的所有页面(Large/Small)共享该 NS 位。
- 描述符所在的翻译表的物理地址由当前的安全状态决定。
Secure 与 Non-secure 内存访问的控制依赖于:
- 当前处理器的安全状态。
- 翻译表条目的来源(Secure 或 Non-secure 内存)。
- 描述符中的 NS 和 NSTable 位。
- 系统寄存器如 NSACR 和 SCR_EL3 的配置。
这些机制确保了在不同安全状态下对内存访问的严格隔离与控制,是 ARM 架构中 TrustZone 安全模型的核心组成部分。
在 ARMv8 架构中,NS bit 和 NSTable bit 是用于控制访问 Secure 和 Non-secure 物理地址空间的重要机制,主要用于内存访问的安全性控制。以下是它们的具体作用:
3 总结
| 位名 | 作用描述 |
|---|---|
| NS bit | 指定当前描述符指向的物理地址空间是 Secure 还是 Non-secure。 |
| NSTable | 指定后续 translation table 的地址空间是否为 Non-secure,影响 NS 的解释。 |
-
NS 位的作用:
- NS 位用于标记页表项所描述的地址空间是 Secure 还是 Non-secure。
- 但这个标记只有在页表本身可信(即位于 Secure 内存中)时才有意义。
-
当
NSTable = 1(页表在 Non-secure 内存)时:- 即使当前访问是 Secure 状态,也会忽略页表项中的 NS 位。
- 因为页表不可信,不能依赖其 NS 标记来决定访问的安全属性。
-
为什么要忽略 NS 位?
- 防止 Non-secure 世界伪造页表项,欺骗 Secure 世界去访问 Non-secure 地址。
- 所以只有当页表在 Secure 内存中(
NSTable = 0)时,NS 位才会被 Secure 世界采信。
只有当页表在 Secure 内存中(NSTable=0)时,NS 位才对 Secure 访问有意义。否则 NS 位会被忽略。
1 对nG的特殊影响:
- 如果页表项是从 Non-secure memory 中读取的,即 NSTable = 1,那么:
- 即使 nG = 0,也必须将该页表项视为 non-Global(行为上等同于 nG = 1)。
- 这是为了防止 Secure 和 Non-secure 世界之间的 TLB 污染。
2 NS/NSTable/nG 三者之间的关系总结
| 字段 | 控制对象 | 生效条件 | 影响 |
|---|---|---|---|
| NS | 页或块的物理地址空间 | Secure translation regime | 决定访问 Secure 或 Non-secure 地址 |
| NSTable | 下一层页表的地址空间 | Secure translation regime | 决定后续页表项的解释方式 |
| nG | 页表项是否是 Global | 所有状态 | 决定 TLB 缓存是否可共享 |
✅ 关键点:如果 NSTable = 1,意味着后续页表项来自 Non-secure memory,那么这些页表项的 NS 和 NSTable 位都将被忽略,并且行为上强制 nG = 1。
二,nG 和ASID的基本概念
1 nG 位(not Global bit)
- nG == 0:表示该转换是全局的,即所有进程共享该 TLB 项。
- nG == 1:表示该转换是非全局的,即该 TLB 项仅适用于当前 ASID 所代表的进程。
2 ASID(Address Space Identifier)
- 用于标识不同进程的地址空间。
- 每个非全局页表项都与一个 ASID 相关联。
- 允许多个进程在 TLB 中共存不同的地址映射,而无需频繁清除 TLB。
3 ASID 在哪里配置
ASID的字段在不同的descriptor格式下各不相同,主要是取决于CONTEXTIDR和TTBR寄存器。
若使用VMSAv8-32,ASID的宽度为8bit
- 如果TTBCR.EAE为0,使用Short-descriptor,则使用 CONTEXTIDR.ASID 来配置ASID。
- 如果TTBCR.EAE为1,使用Long-descriptor,则使用TTBR0 或者TTBR1 来配置ASID。
32-bit TTBR0 format,VMSAv8-32 Short-descriptor 下没有TTBR1

64-bit TTBR0 and TTBR1 format

若使用VMSAv8-64 格式,ASID的宽度为16 bit

CONTEXTIDR, Context ID Register
Identifies the current Process Identifier and, when using the Short-descriptor translation table
format, the Address Space Identifier.


3 工作机制详解
3.1 使用两个 VA 范围(TTBR0 和 TTBR1)
- 系统软件可以将虚拟地址空间划分为:
- Global 区域:通常由 TTBR1 映射,用于操作系统和 I/O。
- Process-specific 区域:通常由 TTBR0 映射,用于用户进程。
3.2 ASID 的选择依据
- 由
TCR_ELx.A1控制当前使用哪个 TTBR 的 ASID:A1 == 0:使用TTBR0_ELx.ASIDA1 == 1:使用TTBR1_ELx.ASID
3.3 TLB 行为
- TLB 项会根据 nG 和 ASID 进行标记。
- 非全局项(nG == 1)仅在 ASID 匹配时才有效。
- 全局项(nG == 0)在所有 ASID 下都有效。
4 与安全状态(Secure/Non-secure)的关系
- 如果页表项来自 Non-secure 状态,即使 nG == 0,也必须视为 nG == 1。
- 这是为了防止 Secure 状态下的 TLB 项错误地共享 Non-secure 的地址映射。
5 限制与注意事项
- Stage 2 translations 和 仅支持单一 VA 范围的 Stage 1 translations 不支持 ASID,因此所有页表项都被视为全局(nG == 0)。
- 在支持两个 VA 范围的 Stage 1 translation 中,ASID 和 nG 才能发挥作用。
6 示例应用场景
操作系统使用方式:
- TTBR0:用于用户进程,每次上下文切换时更新 TTBR0 和 ASID。
- TTBR1:用于内核空间,保持不变。
这样可以:
- 减少 TLB flush 的频率。
- 提高上下文切换效率。
- 实现进程间地址空间隔离。
我们可以通过一个具体的例子来说明 nG(not Global)位 和 ASID(Address Space Identifier) 是如何配合使用的,以实现进程间地址空间的隔离和 TLB 的高效管理。
系统设置
- 使用两个虚拟地址空间:
- TTBR0_EL1:映射用户空间(进程特定)
- TTBR1_EL1:映射内核空间(全局共享)
- 每个进程有自己的页表和 ASID。
- 页表项设置:
- 用户空间页表项:
nG == 1(非全局) - 内核空间页表项:
nG == 0(全局)
- 用户空间页表项:
进程 A
- ASID =
0x01 - TTBR0_EL1 指向进程 A 的用户页表
- 页表项:
- 用户代码页:
nG = 1 - 用户数据页:
nG = 1 - 内核页:
nG = 0
- 用户代码页:
进程 B
- ASID =
0x02 - TTBR0_EL1 指向进程 B 的用户页表
- 页表项:
- 用户代码页:
nG = 1 - 用户数据页:
nG = 1 - 内核页:
nG = 0
- 用户代码页:
TLB 行为
| 页表项类型 | nG 值 | ASID 相关性 | TLB 命中条件 |
|---|---|---|---|
| 用户页(A) | 1 | ASID = 0x01 | 仅进程 A 可用 |
| 用户页(B) | 1 | ASID = 0x02 | 仅进程 B 可用 |
| 内核页 | 0 | 无关 | 所有进程可用 |
优势
- 隔离性:用户空间页表项不会被其他进程使用。
- 效率:内核页表项可以被多个进程共享,无需重复加载。
- TLB flush 减少:上下文切换时只需更新 ASID 和 TTBR0,无需清空整个 TLB。

ASID 与 nG 位的适用范围和限制,尤其是在不同的地址转换阶段(Stage 1 和 Stage 2)以及安全状态(Secure/Non-secure)下的行为
原文: ** ASIDs are supported only when stage 1 translations can support two VA ranges.**
- 解释:ASID(Address Space Identifier)只在 Stage 1 地址转换支持两个虚拟地址范围(VA ranges) 的情况下才启用。
- 背景:这通常指的是使用
TTBR0_ELx和TTBR1_ELx的系统,分别映射用户空间和内核空间。 - 目的:通过 ASID 区分不同进程的地址空间,避免频繁 TLB flush。
原文: Stage 2 translations, and stage 1 translations that can support only a single VA range do not support ASIDs, and all descriptors in these regimes are treated as global.
- 解释:
- Stage 2 转换(用于虚拟化环境中的 Guest OS)不支持 ASID。
- 如果 Stage 1 只支持一个 VA 范围(例如只有 TTBR0,没有 TTBR1),也不支持 ASID。
- 结果:这些情况下,所有页表项都被视为 全局(global),即
nG == 0,TLB 项不区分进程。
原文: In a translation regime that supports global and non-global translations, translation table entries from lookup levels other than the final level of lookup are treated as being non-global, regardless of the value of the nG bit.
- 解释:
- 在支持 nG 的转换机制中,非最终级别的页表项(例如一级或二级页表项)都被视为 非全局(non-global)。
- 即使这些项的
nG == 0,也不被视为全局。
- 原因:只有最终页表项才决定 TLB 项是否可以被多个 ASID 共享。
原文: When a PE is using the VMSAv8-64 translation table format, and is in Secure state, a translation must be treated as non-global, regardless of the value of the nG bit, if NSTable is set to 1 at any level of the translation table walk.
- 解释:
- 如果处理器(PE)处于 Secure 状态,并使用 VMSAv8-64 页表格式,
- 那么只要页表遍历过程中有任何一级页表项的 NSTable == 1(表示该表属于 Non-secure),
- 整个地址转换必须被视为 非全局(nG == 1)。
- 目的:防止 Secure 状态下的 TLB 项错误地共享 Non-secure 页表项,确保安全隔离。
| 转换类型 | 是否支持 ASID | 页表项是否可为非全局(nG == 1) | 特殊处理 |
|---|---|---|---|
| Stage 1(双 VA 范围) | ✅ 是 | ✅ 是 | 支持 ASID 和 nG |
| Stage 1(单 VA 范围) | ❌ 否 | ❌ 否 | 所有项视为全局 |
| Stage 2 | ❌ 否 | ❌ 否 | 所有项视为全局 |
| Secure 状态 + NSTable == 1 | ✅ 是 | ✅ 强制为非全局 | 忽略 nG 位,强制隔离 |
在支持 ASID 和 nG 的 ARMv8 架构中,不同进程可以将同一个虚拟地址映射到不同的物理地址。
为什么可以这样做?
ARMv8 架构支持:
- ASID(Address Space Identifier):标识不同进程的地址空间。
- nG(not Global)位:标识页表项是否是进程特定的。
当页表项设置为 nG = 1,并绑定一个特定的 ASID 时:
- TLB 中的缓存项只对该 ASID 有效。
- 即使两个进程使用相同的虚拟地址,它们的页表项和物理地址可以完全不同。
举例说明
假设有两个进程:
| 进程 | ASID | 虚拟地址 0x40000000 | 映射到的物理地址 |
|---|---|---|---|
| A | 0x01 | 0x40000000 | 0x10000000 |
| B | 0x02 | 0x40000000 | 0x20000000 |
- 两个进程都使用虚拟地址
0x40000000。 - 进程 A 的页表项将其映射到物理地址
0x10000000。 - 进程 B 的页表项将其映射到物理地址
0x20000000。 - 页表项都设置为
nG = 1,因此 TLB 项是进程特定的。
优势
- 内存隔离:每个进程拥有独立的地址空间,互不干扰。
- 安全性:防止进程访问其他进程的内存。
- 效率:通过 ASID 和 nG,TLB 可以缓存多个进程的映射,减少上下文切换时的 TLB flush。

如果只设置 ASID 或只设置 nG,会发生什么情况
情况一:只设置 ASID,不设置 nG(即 nG = 0)
行为:
- 页表项被视为 全局项。
- 即使绑定了 ASID,TLB 会认为该项适用于所有 ASID。
- 所以该 TLB 项可能会被错误地用于其他进程。
后果:
- 地址空间隔离失效:不同进程可能会共享同一个虚拟地址的 TLB 项,导致访问错误的物理地址。
- 安全风险:一个进程可能访问另一个进程的内存。
- TLB flush 变得必要:上下文切换时必须清除 TLB,以防止错误使用。
情况二:只设置 nG = 1,不设置 ASID(或系统不支持 ASID)
行为:
- 页表项被标记为非全局项。
- 但由于没有 ASID,TLB 无法区分属于哪个进程。
- 所有非全局项都被视为属于同一个地址空间。
后果:
- 隔离失效:多个进程的非全局 TLB 项可能互相覆盖。
- 效率低下:系统无法利用 ASID 来缓存多个进程的映射。
- TLB flush 必须频繁进行:每次上下文切换都要清空 TLB。
正确做法:ASID 与 nG 必须配合使用
| 设置 | 是否隔离 | 是否高效 | 是否安全 |
|---|---|---|---|
| ASID ✅ + nG ✅ | ✅ 是 | ✅ 是 | ✅ 是 |
| ASID ✅ + nG ❌ | ❌ 否 | ❌ 否 | ❌ 否 |
| ASID ❌ + nG ✅ | ❌ 否 | ❌ 否 | ❌ 否 |

297

被折叠的 条评论
为什么被折叠?



