浙江大学嵌入式系统软件研发中心 ● 中国杭州
ARM MMU 的模拟
文档控制级别:
作者
贾俊铖
Email
jjc.zju@163.com
时间
2005-6-3
版本
1
2
3
总体结构
不同 ARM 处理器的 MMU 的实现差别较大,但都遵循同一标准。在模拟的时候,分为
与具体 CPU 无关的类(标准类)和与具体 CPU 有关的类(实现类)。标准类包括 ARM::MMU,
ARM::TLB,ARM::Cache 等,实现类包括 ARM::ARM7_MMU,ARM::XScale_MMU 等。
另外还涉及到系统控制协处理器的模拟。
Core::MMU<32>
ARM::MMU
Core::Dummy_MMU<32>
ARM::ARM7_MMU
ARM::XScale_MMU
ARM::TLB
ARM::Cache
Core::Coprocessor
ARM::ARM_Coprocessor
ARM::CP15
ARM::CP14
ARM::CP0
ARM::XScale_CP15
ARM::ARM7_CP15
Wukong Project Documentation
Page 1
浙江大学嵌入式系统软件研发中心 ● 中国杭州
Core 命名空间中的 MMU 是一个类模板,它为具体体系结构的 MMU 实现提供接口。
access( )为 MMU 提供的访存接口。在我们的模拟器中,所有的访存都要通过 MMU 模块,
因此这里的 MMU 是广义的,不单单指真实的硬件 MMU。Core::Dummy_MMU 继承自
Core::MMU,它只提过直接访存的方法。如果某个 CPU 使用的是 Core::Dummy_MMU,则
说明这个 CPU 是没有硬件的 MMU 模块的。如在模拟 ARM7tdmi 处理器的时候,就是使用
了 Core::Dummy_MMU。
Core::Coprocessor 是体系无关的。ARM::ARM_Coprocessor 是 ARM 体系中协处理器的
基类,ARM 中共可以有 16 个协处理器。ARM::CP15 是 ARM 中第 15 号协处理器,它是与
CPU 类型无关的标准类,ARM::ARM7_CP15 和 ARM::XScale_CP15 是具体 CPU 的 15 号协
处理器的实现类。
标准类
ARM::MMU
ARM::MMU 是一个继承自 Core::MMU的纯虚类,它不能被实例化,没有任何一
种 CPU 会直接使用它。它的功能是为模拟器的其他模块提供了一个访问内存的同一接口。
所有通过 ARM::MMU 的访存都是使用 access( )。
ARM::MMU 中的 data_read( ),data_write( ),instr_read( )声明为纯虚函数,在实现类中
得以定义,根据访存的类型,access( )会调用它们其中的一个。它们以 ARM 处理器的内存
访问流程为基础。
ARM::CP15
ARM 体 系 中 的 协 处 理 器 是 由 ARM::ARM_Coprocessor 模 拟 的 , 继 承 自
Core::Coprocessor。与协处理器相关的指令有 MCR,MRC,STC,LDC,CDP 等,而系统
控制协处理器相关的指令只是 MCR 和 MRC。ARM::CP15 继承自 ARM::ARM_Coprocessor
作为所有系统控制协处理器的基类,具体 CPU 的协处理器是由 ARM::CP15 的继承类所表示
的,它们必须定义 MCR( )和 MRC( )这两个方法。
ARM::TLB
ARM::TLB 模拟了快表、地址翻译、权限检测。通过构造函数的调整快表的大小。Entry
结构表示快表项,包含虚拟地址到物理地址的映射信息和访问控制信息。Entry.va 为虚拟地
址,Entry.pa 为相对应的物理地址,Entry.perms 为对应的访问权限,Entry.domain 为所在的
域,Entry.mapping 为映射类型。地址映射一共有极小页、小页、大页和段这几种类型,定
义在 Mapping_Type 中,其中 Mapping_Type.TLB_INVALID 表示无效的映射。
地址翻译过程由 translate( )描述。首先通过 search( )在快表中查找,若找到与给定虚拟
地址对应的项,则将其返回;若没有找到就要通过 TTW(Translation Table Walk)在内存中查
找了。
权限检测由 check_access( )完成。
invalidate_all( )和 invalidate( )用来使所有或单个快表项失效。
Wukong Project Documentation
Page 2
浙江大学嵌入式系统软件研发中心 ● 中国杭州
ARM::Cache
ARM::Cache 模拟高速缓存。高速缓存是为了提高提高存储器性能的硬件结构,它对于
操作系统的正确运行几乎是透明的,虽然有一些 ARM 指令可以通过系统控制协处理器来调
节高速缓存,但模拟器完全可以忽略这些指令或以自己的方式来解释和实现高速缓存的功
能,模拟器甚至可以不模拟这个部件。相类似的是写缓冲,现在没有模拟写缓冲。
ARM::Cache 是模拟的高速缓存比较简单。它的结构和大小在构造时可以指定,提供了
查找、分配和清除数据的方法,使用的替换策略是轮转替换。
ARM720T
ARM::ARM7_MMU
ARM::ARM7_MMU 继承了 ARM::MMU,实现了三个访存的虚函数。由于是统一的 TLB
和高速缓存,instr_read( )实际上调用了 data_read( )。它们的流程基本是参照 ARM720T 硬件
工作的流程的。
ARM::ARM7_CP15
ARM::ARM7_CP15 主要实现了 MCR( )和 MRC( )这两个方法。on_create( )中完成对协
处理器的 0 号寄存器的初始化,写入 32 位标识码。例如,对于 EP7312 开发板,写入的值
为 0x41807200。另外还必须初始化 1 号控制寄存器,使 MMU 处于关闭状态。
异常处理
发生预取指令异常时,FSR 和 FAR 不改变。fetch_instruction( )通过检查访存方法的返
回值,发现出现了异常。fetch_instruction( )调用预取指令异常的处理 on_prefetch_exception( )。
发生数据异常时,FSR 被更新为一个 4 位的错误状态(FS[3:0])和域的序号。虚拟地址被
写入 FAR。引起数据异常的 ARM 指令有:单个数据传输指令(LDR,STR),SWP 指令,块
数据传输指令(LDM,SDM)。在这些指令的模拟函数中,根据 MMU 访存方法的返回值,
确定是否发生异常。若有异常,则调用数据异常的处理 on_dataabt_exception( )。
XScale
ARM::XScale_MMU
ARM:: XScale_MMU 继承了 ARM::MMU,实现了三个独立的访存虚函数。对它们的流
程做了一些简化,没有使用 Cache,每次访存都是直接访问内存的。
Wukong Project Documentation
Page 3
浙江大学嵌入式系统软件研发中心 ● 中国杭州
ARM::XScale_CP15
ARM::XScale_CP15 主要实现了 MCR( )和 MRC( )这两个方法。on_create( )中完成对协
处理器的 0 号寄存器的初始化,写入 32 位标识码。例如,对于 Lubbock 开发板,写入的值
为 0x69052100。另外还必须初始化 1 号控制寄存器,使 MMU 处于关闭状态。
Wukong Project Documentation
Page 4