MIPS内存管理单元的设计与实现

摘要:设计MIPS324kc 处理器内存管理单元(MMU) ,该模块对处理器地址进行合法性检查,并按照不同的地址空阔对虚拟地址进行静态或动态映射。在硬件上采用三级流水线方式实现JTLB ,并为处理器指令端口和数据端口设计相应的快表以提高TLB 的查询速度。MMU与总线接口模块的时序采用简化的AMBA 协议,与处理器进行联合调试并运行Linux 操作系统,同时在功能上通过FPGA 验证。该模块经过DC 综合后,面积约为32K 等效逻辑门。

1 概述
内存管理单元(MMU) 是处理器支持操作系统高效运行的基础,与软件内存管理模块川相结合完成了虚拟地址到物理地址的转换。同时, MMU 能够对处理器发出的地址进行合法性检验,在硬件上提供了内存访问授权控制。由于MMU与处理器体系结构高度相关,因此在不同的处理器下内存管理机制区别很大。

根据MJPS324kc[2 1 处理器对内存管理的规毡,针对不同地址空间采取了静态和动态映射相结合的方式,其中动态映射以地址后备转换表(TLB) 为基础,硬件设计上采用与处理器流水线平行对齐的流水线结构。为了加快地址转换,在处理器指令瑞口和数据端口分别设计了ITLB 和DTLBo 与总线访问接口的连接,采用简化的AMBA 协议。

2 MMU 总体结构
MMU 总体结构如图1所示。

图1 MMU 总体结构

整个内存管理模块包含TLB 、主控制器和总线接口模块。其中, TLB 又分为JTLB 、ITLB 和DTLBo MMU 接受处理器访存请求时,根据虚拟地址和处理器当前的工作模式进行地址转换。如果访问合法,它将把得到的物理地址送给cache或者是总线接口进行数据读写;否则,它会触发处理器异常。MMU 在此处于核心地位,官把处理器、缓存、总线接口3 个模块粘合起来,使访存操作能安全高效地进行。

对于→次普通的访问内存操作,处理器发出的虚拟地址首先会经过主控制器判断,如果该地址属于静态地址映射范围,则根据固定的映射算法把地址转换为物理地址并交由总线接口以处理具体的数据读写。如果该地址属于动态地址范围映射,则控制器会启动相应的TLB 工作来查找地址映射表。如果TLB 命中,则输出物理地址;否则,发出TLB 缺失异常,处理器进入异常状态并调用相应的处理程序重填TLB。

3 TLB 梳水线控制器
3.1 TLB
图2 是MIPS 流水线结构示意图,阴影部分I-TLB 是取指令阶段, ITLB 翻译指令地址,该操作需耍占用半个时钟周期,在后半个周期进行指令cache 的地址比较操作。类似的,D-TLB 是流水线M 级的前半个周期, DTLB 对处理器数据端口的地址进行实地址转换。

图2 处理器及TLB 流水线示意图

受系统频率的限制,对JTLB 的访问采用三级流水线的完成。另外, JTLB 表项的更新是通过软件来完成的,即编程人员可见。相关的指令有4 条: TLBR(读取TLB 表项) ,TLBP(查询TLB 表项), TLBWR( 随机写入TLB 表项) ,TLBWI(索引写入TLB 表项)。采用与处理器主流水线并行的三级流水线,可以方便地处理指令的顺序递交,简化了处理器设计。TLB 流水线第1 级为表项查询,在这一级中根据处理器给出的虚拟地址和进程10 ,查询JTLB 内是否存在对应的映射关系;第2 级为地址输出级,如果第一级命中则把物理地址送至cache 或者总线接口单元,否者该级空转;第3 级为TLB 更新级,完成TLB 状态的更新。

启动JTLB 工作有以下3 种情况:处理器读取指令,处理器数据读写操作, TLB 指令操作。这三者的操作没有特别的限制,它们可在任意时钟周期发出。当冲突发生时,遵循数据口的优先级高于指令口的原则。这是因为数据端口的指令在时间上要先于指令端口的指令,按照顺序递交指令的原则要优先处理数据端口防止流水线的停顿和阻塞。

3.2 TLB 的实现
TLB 的表项内容如图3 所示,由两部分组成:虚拟地址页丽号和物理地址页面号[3J 。其中虚拟地址页商号是虚拟地址的高20 比特,另外还有进程标识号(ASIO)和全局符号位(G) ,这样处理器便可以同时支持多进程运行。CPU 访问内存时将虚拟地址和进程标识号送出至MMU ,需要TLB 翻译的地址则与页袤的虚拟地址页面号进行比较。如果表中有相同且有效的映射对存在,则TLB命中,同时将该表项对应的物理页面号选通输出。

图3 TLB 表项格式

ITLB 是处于CPU 指令口的快表, ITLB 含有3 个JTLB表项,采用寄存器来实现表项的存储,并且由于只含有3 项,所以能用速度较快的组合逻辑电路比较来实现。盯LB 对软件编程人员来说是透明的,即没有特殊的指令来维护ITLB 表项的内容。当ITLB 发生miss 时,硬件逻辑会从JTLB 查询对应的表项载入ITLB 表项(ITLB 表项的替换采用LRU 算法)0 DTLB 的情况类似于ITLB ,只是它处于处理器的数据端口。由于JTLB 也只能含有有限的表项,因此不免会发生JTLB 的表项缺失。如果发生JTLB miss ,内存管理模块会触发TLB 缺失异常,当处理器接收到该信号后会中断当前的程序运行,并将控制权交给TLB 异常处理程序。TLB 会根据缺失地址,通过查找内存存放的有关虚拟与物理地址的映射关系,并通过TLB 写指令(TLBWI 或者TLBWR)将此对应关系写入JTLB 。由于在JTLB 存在较多表项,如果像ITLB 和DTLB那样用寄存器来实现数据存储会占用较大的硬件面积,因此在硬件实现时可采用SRAM 来实现。

3.3 指令和数据接口
通过MMU 模块发出的对内存的访问操作应该遵循特定的接口规范,在本文的系统中采用了AMBA 总线协议。MMU的数据访问接口和指令访问接口通过总线接口模块访问系统总线。由于MMU 数据的访问相对简单,同时为了便于总线接口的设计,采用了简化的AMBA 协议,即采用先绘出地址然后处理数据的总线流水线模式,图4 是接口的状态变换图。

图4 MMU 数据访问状态转换图

当总线接口模块收到来自MMU 指令接口或者数据接口的访问请求后,根据实际情况返回grant 信号给请求接口。此时访问进入地址阶段,此周期内把经过MMU 处理的地址送给总线接口模块,并经过它送给系统总线。地址必须保持有效直至返回ready 信号。一旦MMU 采样到ready 信号的高电平,就进入数据处理阶段。如果本次访问是一次数据写操作,数据线上将所要写的数据置为有效;如果是→次读操作,那么MMU 处于等待状态。当再次采样到ready 高电平时,本次数据访问结束,可将写操作的数据撤销。此时读数据有效,MMU 可将此数据转发给处理器。MMU 数据访问简单,一般不支持突发(burst)操作,且数据端口和指令端口的冲突由总线接口模块来解决,所以采用数据和指令独立的端口,上述访问过程同样适用于指令端口,且指令端口只有读操作。

4 测试验证
该模块用Verilog 实现,并在硬件仿真器(Mentor Veloceemulator)上与处理器联合调试,运行Linux 操作系统[4J 。图5给出了一次典型的JTLB 地址转换过程。图中指令请求(I)发生了ITLB miss(II) ,进入JTLB 查询(III) ,并且JTLB 命中输出物理地址(IV) ,最后进行状态更新(V) 。

图5 一次典型的JTLB 地址映射操作

图6 是一次典型的总线接口单元交互操作, MMU 发出数据写操作(1) ,申请总线(II) 成功后进入地址阶段(II1) ,然后进入数据阶段(IV) ,最后接收到ready 信号高电平表示操作结束。本模块采用SMICO.13 工艺库,用DC 综合结果显示在200MHz 时钟频率约束下占用芯片逻辑32 K 等效逻辑门。系统整体上同过了FPGA 验证。

图6 一次典型的数据写操作

5 结束语
本文实现了MIPS 处理器上内存管理模块,该模块主要以TLB 为基础,实现处理器虚拟地址到总线物理地址的转换。并且对不同的TLB 采用了不同的物理实现方式,以满足系统的时序设定。MMU 通过了硬件仿真器和FPGA 验证,对Linux 的运行提供了良好的硬件支持。

作者:卢仕昕,尤凯迪,韩军,曾晓洋 作者:计算机工程

--电子创新网--
粤ICP备12070055号