摘要:内存管理单元是体系结构中少数与操作系统进行直接交互的接口之一,其模拟模型的执行效率和扩展能力在全系统模拟环境中尤为重要。本文介绍了SimSoc 全系统模拟框架中内存管理单元的设计思路和基本实现,基于SystemC 事务级建模技术设计并实现了灵活的内存管理单元模拟框架,同时通过引入不同的优化策略实现了高效的访存模拟。
1 引言
随着嵌入式系统的不断发展,系统平台的开发中越来越多的需要在日趋复杂的片上系统上运行更大规模的软件,全系统模拟已成为嵌入式系统平台研发的必然趋势。为了提供全系统的模拟支持,模拟器必须忠实的对内存管理单元(Memory ManagementUnit,MMU)的功能性进行模拟。不同体系结构中MMU 功能性实现的软硬件接口划分存在着较大的差异,这无疑对模拟模型的灵活性提出了独特的挑战。于此同时,MMU 所进行的虚拟地址到物理地址的转换操作处在每指令获取与数据访问的关键路径上,其执行效率将直接影响系统的整体性能[1],因此在全系统模拟器建模中,灵活且高效的MMU 建模具有十分重要的地位。
SimSoc[2]是一个整合了硬件建模技术的全系统模拟框架,其基于SystemC 进行硬件建模并使用事务级建模技术(Transaction Level Modeling,TLM)来抽象组件之间的内部通讯,旨在从一个更高的抽象层次上提高模拟器的执行速度与建模速度。本文将首先对SimSoc 全系统模拟器的整体架构及关键技术进行简要的介绍,然后针对SimSoc 中MMU 的模拟要求详细的阐述MMU 模型在灵活性以及高效性上的设计实现。
2 SimSoc 全系统模拟框架
SimSoc 是基于SystemC 事务级建模技术构建的灵活、可配置的全系统模拟框架,整个系统由SystemC 内核驱动,其整体架构如图1 所示:

图1 SimSoc 体系结构
SimSoc 在单一的模拟框架中集成了两项关键的技术:
基于 SystemC 的事务级建模技术
基于事务级建模的基本思想,SimSoc 中目标平台的每一个硬件组件被实现为一个独立的SystemC TLM 模块,模块之间通过高度抽象的总线通道进行通讯。这种计算与通讯相分离的设计思想,使得建模过程中模块功能与通讯之间的设计开发过程相互正交,从而有力地对建模的复杂度进行了控制,体现了分而治之的建模策略。
指令集模拟器的集成
为了在一个更高的执行速度上对处理器进行模拟,SimSoc 将平台中每一个处理器抽象为由指令集模拟器(Instruction Set Simulator,ISS)、动态翻译器以及MMU 共同组成的处理器模型。该模型实现了对目标处理器指令级的模拟,模拟了指令的执行、异常、中断以及虚拟地址到物理地址的映射。SimSoc ISS 使用动态翻译技术[5]将目标指令翻译为可执行的中间表示,并通过对翻译结果的本地缓存和直接重用获得了显著的性能收益。

图2 使用翻译cache 的动态翻译机制
3 内存管理单元的设计与实现
内存管理单元是支持虚拟存储管理的部件,其被用于自动的在主存与二级存储之间移动程序代码与数据,从而造成单一的大型存储的假象。为了支持系统级模拟,全系统模拟器必须忠实的模拟MMU 的基本功能性,这主要包含虚拟到物理地址的转换,进程空间访问权限检查和转换后援缓冲器(Translation Lookaside Buffer,TLB)及其相关指令操作的模拟。
3.1 MMU 的基本建模要求
对于每内存访问,处理器首先计算出有效的虚拟地址并交由MMU 进行虚拟空间到物理空间的地址转换。MMU 首先根据虚拟地址在TLB 中查找是否存在前期缓存的转换结果,如果命中,则直接根据缓存表项生成相应的物理地址,检查访问权限并终将地址转发给总线进行外部访存操作。而如果TLB 发生缺失,缺失处理在不同的体系结构中存在较大的实现差异,主要基于不同的软硬件实现接口:
对于硬件加载的 TLB 而言,如ARM 体系结构中的TLB,将直接产生硬件的页表查找,从内存的页表中获得相应的TLB 表项,并将结果添加到TLB 中。在这种情况下,TLB 只是对近期的转换结果进行缓存从而加快地址转换的速度,即只对模拟目标的性能指标产生影响而对于功能性透明。
对于软件加载的 TLB 而言,如MIPS 体系结构中的TLB,其表项所包含的是仅有的虚实地址映射关系。当发生TLB 缺失时,硬件将产生TLB 缺失异常,此时由软件来完成TLB 结构的填充,而填充的内容对于模拟器而言是未知的。
因此,为了忠实的模拟由于缺页错误而引起的用户与系统代码之间的交互,在软件加载的TLB 系统中,TLB 必须被正确的模拟;而在硬件加载的系统中,更重要的是生成正确的内存访问地址来进行页表查找,在此种情况下TLB 并不要求进行高度模拟。这种体系结构相关的实现差异对MMU 建模的灵活性提出了新的要求;而与此同时,由于处在每次访存的关键路径上,且典型的RISC 代码中每四条指令就有一条是访存指令,低效的MMU 模拟势必极大的影响整个系统的执行效率。灵活及高效的MMU 建模也是全系统模拟器开发中的关键问题。
3.2 MMU 模拟框架的灵活性设计
基于灵活性的建模要求,SimSoc 更关注于提供一个MMU 模拟框架来支持不同体系结构中虚存系统组件的创建,而不是仅仅实现一个单独的MMU 模块。这主要是基于组件的模块化设计以及可重用性来实现的。
SimSoc 的MMU 模拟框架提供了可重用的组件库来在不同的体系结构间表示通用的虚拟存储系统软硬件结构,如MMU、TLB 以及相应的系统控制协处理器等。各类模块将不同组件的基本功能性进行了封装,并通过良好定义的交互接口来指定组件的替换方案以及如何与其它组件进行通讯。MMU 使用模板模式[6]定义了虚实地址转换功能的算法骨架,而将一些体系结构相关的具体操作延迟到子类中去实现,如TLB 缺失时,ARM MMU 实现硬件的页表查找,而MIPS MMU 则抛出缺失异常以触发软件加载。

图3 模板模式在MMU 地址转换中的应用
模块化的设计使得 SimSoc 能够有效降低MMU 建模的复杂度,从而将问题分解到各个能独立建模的组件之中;于此同时,模拟框架设计的灵活性也使得MMU 设计者能够在一个通用功能及其实现的基础上开始具体的MMU 模型开发,从而更好的聚焦于描述/生成目标组件、在不同的上下文环境中重复使用已验证的设计选择,或者使用其它不同的算法来替换相同的功能性,从而提高建模速度以及模型自身的健壮性。
3.3 MMU 模拟框架的高效性设计
基于高效性的建模要求,SimSoc 在MMU 建模过程中,针对访存操作的空间局部性以及不同目标模块的实现和访问频率等特征采用了不同的模拟优化策略。
地址转换的结果缓存
为了优化每次地址转换过程中对于 TLB 表项的逐行查找过程,SimSoc MMU 针对地址访问的空间局部性原理,维护了整个虚拟内存空间的以虚页号为索引的TLB 表项缓存数组,从而通过有效的减少TLB 的缺失次数来避免昂贵的地址转换过程。
缓存数组的使用是一个典型的以空间换取时间的性能优化策略,其使得MMU 的实现独立于具体TLB 的大小、组织结构以及替换策略,但在加速模拟过程的同时也导致了比实际运行更高的TLB 命中率。这种实现方式在一定程度上体现了全系统模拟器建模过程中以一定模拟度换取模拟速度的权衡策略。
基于动态翻译机制的指令获取优化
SimSoc 的动态翻译机制每次以页为单位,将目标二进制指令翻译为一一对应的伪代码,并进行本地缓存以在下次访问时直接重用。基于目标指令PC 与翻译后伪指令PC 移动时相对于代码页起始位置偏移的一致性,SimSoc 每次以页为单位对指令进行获取。
与数据访问不同的是,在以翻译页为单位的指令获取方法中,实际的虚拟地址到物理地址的转换与访问权限检查对于每一个翻译到翻译缓存的代码页来说只有,从而排除了对每一条目标指令进行逐条地址转换的需要,提高了执行的效率。
直接内存访问
SimSoc 中ISS 通过MMU 的发起者端口与总线通道进行通讯,其接口函数根据当前目标地址的映射将相应的TLM 事务请求转发到实现为目标设备的模块中。基于对内存模块和外围设备访问的实现方式以及访问频率的不同,SimSoc 实现了两种不同的接口通讯机制:基本的通用模式使用了OSCI TLM-2 草案[3]中的阻塞传输接口,在SimSoc 中其被设置为非时序的模拟,通过这种方式,SimSoc ISS 能够兼容所有遵循OSCI 事务建模标准的非时序硬件模块;而针对频繁的内存模块访问,优化的模式使用了直接内存接口(Direct MemoryInterface,DMI)概念并编写了自己的实现。通过启用DMI,MMU 可以直接对模拟的内存数组进行访问,而只在需要访问内存以外的其它设备时才生成真实的事务,从而获得了更快的内存访问速度。
4 结论
作为体系结构与操作系统少数直接交互的接口之一,灵活且高效的MMU 建模在全系统模拟开发中占有重要的地位。SimSoc 全系统模拟器中的MMU 模拟框架基于模块化、可重用的组件设计以及设计模式在面向对象组件建模中的引入成功的屏蔽了不同体系结构下MMU 的实现差异性,提供了MMU 模拟框架设计中的灵活性;而通过对地址转换结果进行高速缓存,以翻译页为单位进行指令获取,启用直接内存访问接口等优化策略的使用,有效地实现了MMU 建模的高效性。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。