arm64 memory 属性 Device-nGnRnE

armv8  dump mmu table的时候有看到memory 属性Device-nGnRnE

查阅armv8  trm得到如下信息,把memeory 分成两个类型device 与 normal, device 类型的memory的访问行为比较复杂,例如read clear, read inc addr(读同一个寄存器,实际会递增的去访问某一块memory),这些特性决定了cpu 不能像normal memory 那样对memroy 访问进行re-order,normal memory即是我们常理解的内存

mmu 用如上这几种形式来描述memory block的不同属性,不同属性定义了不同的访问行为: 

for normal memory:

shareable domain的概念。如何划分shareable domain是和系统设计相关,我们假设一个系统的domain分配如下: 
(1)所有的cpu core属于一个inner shareable domain 
(2)所有的cpu core和dma controller属于一个outer shareable domain 
在ARM architecture中,对一个normal memory location而言,是否是coherent是和它的页表中的shareability attribute的设定相关。 
(1)non-shareable。根本不会再多个agent之间共享,不存在coherent的问题。 
(2)inner-shareable。说明inner shareable domain中的所有的agent在对该内存进行数据访问的时候,硬件会保证coherent。 
(3)outer-shareable。说明outer shareable domain中的所有的agent在对该内存进行数据访问的时候,硬件会保证coherent。

//from wowo tech

Write-through(直写模式)在数据更新时,同时写入缓存Cache和后端存储。此模式的优点是操作简单;缺点是因为数据修改需要同时写入存储,数据写入速度较慢。
Write-back(回写模式)在数据更新时只写入缓存Cache。只在数据被替换出缓存时,被修改的缓存数据才会被写到后端存储。此模式的优点是数据写入速度快,因为不需要写存储;缺点是一旦更新后的数据未被写入存储时出现系统掉电的情况,数据将无法找回。

for device memory:

对于device type,其总是non cacheable的,而且是outer shareable,因此它的attribute不多,主要有下面几种附加的特性:

(1)Gathering 或者non Gathering (G or nG)。这个特性表示对多个memory的访问是否可以合并,如果是nG,表示处理器必须严格按照代码中内存访问来进行,不能把两次访问合并成一次。例如:代码中有2次对同样的一个地址的读访问,那么处理器必须严格进行两次read transaction。

(2)Re-ordering (R or nR)。这个特性用来表示是否允许处理器对内存访问指令进行重排。nR表示必须严格执行program order。

(3)Early Write Acknowledgement (E or nE)。PE访问memory是有问有答的(更专业的术语叫做transaction),对于write而言,PE需要write ack操作以便确定完成一个write transaction。为了加快写的速度,系统的中间环节可能会设定一些write buffer。nE表示写操作的ack必须来自最终的目的地而不是中间的write buffer。

<think>嗯,用户问的是ARM架构中的TTBR0和TTBR1是什么。之前他们问过ASID是否保存在PCB中,现在转向ARM的内存管理相关寄存器,可能是在学习操作系统或体系结构,尤其是ARM的MMU部分。 首先,我需要确定用户的基础知识水平。他们可能已经了解进程控制块和ASID,现在想深入理解ARM的地址转换机制。TTBR0和TTBR1是ARM的内存管理单元(MMU)中的关键寄存器,负责地址转换,但用户可能不太清楚它们的具体作用和区别。 接下来,我需要回忆ARM架构的内存管理细节。ARMv7和ARMv8有不同的实现,可能需要分开解释。比如,在ARMv7中,TTBR0和TTBR1分别用于用户空间和内核空间,而在ARMv8-A中,它们可能对应不同的异常级别或地址空间划分。 用户可能想知道这两个寄存器的作用、区别以及使用场景。比如,为什么需要两个转换表基址寄存器?可能涉及到地址空间的划分,如低地址和高地址分别由TTBR0和TTBR1管理,这样可以隔离用户和内核的页表,提高安全性和效率。 还要考虑用户可能的应用场景,比如操作系统开发或嵌入式系统,这时候实际使用中的配置实例会很有帮助。例如,Linux内核如何配置TTBR0和TTBR1,或者在不同异常级别(EL0/EL1)下的使用方式。 另外,需要检查是否有常见的误解需要澄清。比如,TTBR0是否只用于用户空间,而TTBR1用于内核空间?在ARMv8中,是否支持更大的地址空间,或者不同的阶段转换? 还需要提供一些具体的例子,比如地址转换的过程,如何根据虚拟地址选择TTBR0或TTBR1,以及如何配置页表基址寄存器。可能还需要提到相关的控制寄存器,比如TCR(Translation Control Register)中的配置位,如何影响TTBR的选择。 最后,确保回答结构清晰,分点解释,结合实际应用和可能的配置示例,帮助用户逐步理解这两个寄存器的功能及其在ARM架构中的重要性。</think>### **ARM 架构中 TTBR0 与 TTBR1 的核心作用** 在 ARM 架构中,**TTBR0(Translation Table Base Register 0)** 和 **TTBR1(Translation Table Base Register 1)** 是内存管理单元(MMU)的关键寄存器,负责 **虚拟地址到物理地址的映射**。它们通过 **多级页表机制** 支持灵活的地址空间划分,同时实现 **用户态与内核态的隔离**。以下是其核心原理与应用场景的详细解析。 --- ### **1. 基本功能** #### **(1) 页表基地址存储** - **TTBR0**:存储 **用户空间页表(低地址空间)** 的基地址,通常用于应用程序的虚拟地址映射(如 Linux 用户进程的 `0x0000_0000` ~ `0x0000_ffff_ffff`)。 - **TTBR1**:存储 **内核空间页表(高地址空间)** 的基地址,用于操作系统内核的虚拟地址映射(如 Linux 内核的 `0xffff_0000_0000_0000` 以上)。 #### **(2) 地址空间划分** - **ARMv7(32 位)**: - TTBR0 管理 `0x0000_0000` ~ `0x7fff_ffff`(低 2GB)。 - TTBR1 管理 `0x8000_0000` ~ `0xffff_ffff`(高 2GB)。 - **划分依据**:由虚拟地址的最高位决定(最高位为 `0` 使用 TTBR0,为 `1` 使用 TTBR1)。 - **ARMv8-A(64 位)**: - TTBR0 管理 `0x0000_0000_0000_0000` ~ `0x0000_ffff_ffff_ffff`(低 48 位地址)。 - TTBR1 管理 `0xffff_0000_0000_0000` ~ `0xffff_ffff_ffff_ffff`(高 48 位地址)。 - **划分依据**:通过 `TCR_ELx.TBI`(Top Byte Ignore)控制地址范围。 --- ### **2. 核心设计目标** #### **(1) 用户态与内核态隔离** - **安全性**:用户进程通过 TTBR0 访问自己的页表,无法直接修改内核的 TTBR1 页表,避免越权访问。 - **效率**:内核无需在用户进程切换时更新 TTBR1,仅需切换 TTBR0,减少 TLB 刷新开销。 #### **(2) 灵活的地址空间配置** - **动态范围调整**:通过 `TCR_ELx.T0SZ` 和 `TCR_ELx.T1SZ` 控制 TTBR0/TTBR1 管理的地址空间大小。 - 例如:设置 `TCR_EL1.T0SZ = 16` 表示 TTBR0 管理低 `2^(48-16) = 4TB` 地址空间。 #### **(3) 多级页表支持** - **页表层级**:TTBR0/TTBR1 指向的页表可以是 2 级(ARMv7)或 4 级(ARMv8),支持大页(2MB/1GB)和小页(4KB)。 - **ASID 绑定**:TTBR0 可与 ASID(Address Space ID)关联,实现不同进程的 TLB 隔离(详见前文 ASID 机制)。 --- ### **3. 实际应用场景** #### **(1) 进程切换** - **用户进程切换**: 内核仅需更新 TTBR0 为新进程的页表基地址(同时更新 ASID),而 TTBR1 保持不变(内核地址空间共享)。 - **上下文切换代码示例(简化伪代码)**: ```asm ; 假设新进程的页表基地址已加载到 x0 msr TTBR0_EL1, x0 ; 更新 TTBR0 isb ; 同步指令流 tlbi vmalle1 ; 刷新 TLB(可结合 ASID 优化) dsb sy ``` #### **(2) 内核启动初始化** - **早期页表配置**: 内核启动时,通过 TTBR1 映射内核代码、设备内存等固定区域,确保内核在开启 MMU 后能继续执行。 - **ARMv8 启动流程示例**: 1. 配置 `TCR_EL1` 定义地址空间划分。 2. 将内核页表基地址写入 `TTBR1_EL1`。 3. 开启 MMU 并跳转到高地址(`0xffff_0000_...`)执行。 #### **(3) 用户态与内核态切换** - **系统调用/中断处理**: - 用户态(TTBR0)触发异常后,CPU 自动切换到 TTBR1 的页表(内核地址空间)。 - 返回用户态时,恢复 TTBR0 和用户 ASID。 --- ### **4. 关键寄存器关联** #### **(1) TCR(Translation Control Register)** - **TCR_ELx.T0SZ/T1SZ**:定义 TTBR0/TTBR1 管理的地址空间大小。 - **TCR_ELx.AS**:控制 ASID 长度(8 位或 16 位)。 - **TCR_ELx.TG0/TG1**:设置页表粒度(4KB/16KB/64KB)。 #### **(2) MAIR(Memory Attribute Indirection Register)** - 定义内存属性(如 Device-nGnRnE、Normal Cacheable),页表项通过 MAIR 索引引用这些属性--- ### **5. 性能优化实践** #### **(1) TLB 效率提升** - **ASID 绑定**:TTBR0 与 ASID 结合,避免进程切换时全局刷新 TLB。 - **大页映射**:对内核代码或频繁访问区域使用 1GB/2MB 大页,减少页表遍历层级。 #### **(2) 地址空间隔离** - **用户进程隔离**:每个进程的 TTBR0 指向独立的页表,防止内存越界。 - **内核保护**:TTBR1 的页表禁止用户态访问,阻止恶意修改内核数据。 --- ### **6. 对比其他架构** #### **(1) x86 的 CR3 寄存器** - x86 使用单一 `CR3` 寄存器存储页表基地址,通过 PCID(ASID 类似物)实现 TLB 隔离。 - ARM 的 TTBR0/TTBR1 设计天然支持用户/内核空间分离,减少切换开销。 #### **(2) RISC-V 的 SATP 寄存器** - RISC-V 的 `SATP` 寄存器类似于 TTBR0,但通过模式位(MODE)选择页表格式,灵活性更高。 --- ### **总结** - **TTBR0**:管理用户空间地址映射,进程切换时动态更新,与 ASID 配合实现高效 TLB 管理。 - **TTBR1**:固定映射内核空间,保障内核安全性和执行效率。 - **设计哲学**:通过硬件级地址空间划分(低/高地址)和寄存器隔离,平衡性能、安全与灵活性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值