ARM 的虚拟内存系统架构(VMSA)下的MMU对不同安全状态(Secure 和 Non-secure )下的内存访问控制,以及ASID/ nG 位(not Global bit)的使用解析

Secure/Non-secure/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/EL0Secure PL1&0 stage 1✅ 支持 NS bit
Non-secure EL1/EL0Non-secure PL1&0 stage 1 + stage 2❌ 忽略 NS bit
Non-secure EL2Non-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 bitNSTable bit 是用于控制访问 Secure 和 Non-secure 物理地址空间的重要机制,主要用于内存访问的安全性控制。以下是它们的具体作用:


3 总结

位名作用描述
NS bit指定当前描述符指向的物理地址空间是 Secure 还是 Non-secure。
NSTable指定后续 translation table 的地址空间是否为 Non-secure,影响 NS 的解释。
  1. NS 位的作用

    • NS 位用于标记页表项所描述的地址空间是 Secure 还是 Non-secure。
    • 但这个标记只有在页表本身可信(即位于 Secure 内存中)时才有意义。
  2. NSTable = 1(页表在 Non-secure 内存)时

    • 即使当前访问是 Secure 状态,也会忽略页表项中的 NS 位
    • 因为页表不可信,不能依赖其 NS 标记来决定访问的安全属性。
  3. 为什么要忽略 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.ASID
    • A1 == 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)1ASID = 0x01仅进程 A 可用
用户页(B)1ASID = 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_ELxTTBR1_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映射到的物理地址
A0x010x400000000x10000000
B0x020x400000000x20000000
  • 两个进程都使用虚拟地址 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 ✅❌ 否❌ 否❌ 否
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SOC罗三炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值