玄铁C910内存管理与地址转换技术

本文详细介绍了玄铁C910处理器的内存管理单元(MMU)及其地址转换技术,涵盖MMU的基本原理、TLB结构、页表遍历及MMU一致性等内容。

玄铁C910内存管理与地址转换技术

玄铁 C910 简介

C910 兼容 RISC-V 架构,采用12级超标量流水线,针对算术运算、内存访问以及多核同步等方面进行了优化,同时标配内存管理单元,可运行 Linux 等操作系统;采用3发射、8执行的深度乱序执行架构,配有单/双精度浮点单元,可进一步选配面向矢量运算引擎,适用于人工智能、5G、边缘服务器等对性能要求很高的应用领域。C910 是个开源的 RISC-V CPU,它的代码实现具体在 github 可见。

C910 MMU(Memory Management Unit)兼容 RISC-V SV39 标准。其作用主要有:

  • 地址转换:将虚拟地址(39 位)转换成物理地址(40 位)
  • 页面保护:通过对页面的访问者进行读/写/执行权限检查
  • 页面属性管理:扩展地址属性位,根据访问地址,获取页面对应属性,供系统进一步使用

MMU 代码文件结构

内存管理单元部分的源码主要集中在gen_rtl代码中的mmu部分,相关逻辑主要包含在以下文件中:

文件名.v 文件内容
ct_mmu_arb MMU中的仲裁器,当同时有多个读、写请求发送到JTLB时需要对它们进行仲裁,选择优先级更高的请求优先响应执行
ct_mmu_dplru 用于实现DTLB中伪LRU替换算法的模块
ct_mmu_dutlb_huge_entry DTLB大页表项,存放1G页对应的页表项信息
ct_mmu_dutlb_read 实现Load/Store访存指令读DTLB模块的逻辑
ct_mmu_dutlb DTLB顶层
ct_mmu_dutlb_entry DTLB表项,用于存放用于Load/Store访存指令虚实地址转换的页表项
ct_mmu_iplru 用于实现ITLB中伪LRU替换算法的模块
ct_mmu_iutlb_fst_entry ITLB第一级表项,用于存放指令PC虚实地址转换的页表项
ct_mmu_iutlb ITLB顶层
ct_mmu_iutlb_entry ITLB第二级表项,用于存放指令PC虚实地址转换的页表项
ct_mmu_jtlb_data_array 用于存放JTLB数据信息
ct_mmu_jtlb_tag_array 用于存放JTLB标志信息
ct_mmu_jtlb JTLB顶层
ct_mmu_ptw Page Table Walk单元,当TLB miss时通过PTW模块根据请求转换的虚拟地址访问内存中的页表,找到对应的物理地址
ct_mmu_regs MMU系统控制寄存器相关逻辑,不仅包含标准的SATP寄存器相关控制逻辑,还包括玄铁C910自定义扩展的SMIR、SMCIR、SMEL和SMEH寄存器的相关控制逻辑
ct_mmu_tlboper MMU控制寄存器与sfence.vma指令广播对TLB操作相关逻辑
ct_mmu_top MMU顶层

RISC-V CPU 的 Sv39

有关 RISC-V 的特权架构和分页机制,我在 RISC-V 特权架构 中介绍了很多,若读者不太熟悉内存管理,可以看一下该博客文末的附录内容。这里再将 Sv39 分页机制简单介绍一下:
在这里插入图片描述

在 RISC-V 中,SATP(Supervisor Address Translation and Protection Register) 寄存器的作用是在监管者模式下,控制地址转换与保护的。当 satp 启动分页时,在监管者模式或用户模式下,虚拟地址 (VA) 会将 satp 寄存器中根页表地址作为基址 (base),以及自带的页号作偏移 (VPN[1]),在页表中通过计算偏移位置 (base + VPN[1] * 4) 找到页表项 (Page Table Entry PTE)。如果该 PTE 不是叶 PTE(什么是页 PTE 下面会解释),那么再将刚刚找到的 PTE 作为基址,用虚拟地址携带的第二个页号作偏移,继续算出第二个页表项,直到获得物理地址 (PA),更加详细的虚拟地址转换过程见下小节。

虚拟地址和物理地址的二进制格式。以 Sv39 分页模式为例,虚拟地址、物理地址的编码都是将页号放在高位处(MSB),而将偏移量放在 低位(LSB)处。Sv39 分页支持三级分页。从偏移量位长可以看出,Sv39 的页粒度最小为 4KiB。其一级页表含有 512 个 PTEs,每个页表项占 8 字节,总共 4 KiB。
页表项。Valid 位指示该 PTE 是否有效;Readable,Writeable,eXecutable 指示了该页是否可读、可写、可运行,当这三位都是 0 时,表明该 PTE 指向了下一层页表,其为非叶 PTE ,否则就是叶 PTE;User 位指示了该页是否可以被用户模式访问;Global 指示了全局映射,存在于所有的地址空间中,可以被所有进程访问;Access 位指示了该页最近是否被读、写、取;Dirty 位指示了虚拟页最近是否被写过。对于非叶 PTE,D,A,U 位被保留,并被清零。RSW 是保留的,用于操作系统软件。

RISC-V 设计分页机制时充分了解并吸取了早期体系结构的设计教训。x86-64 分页中上层页表控制了下层页表,如果上层页表是只读的,那么被该页表控制的下层页表就不能被写入了,这可不是什么聪明的做法。而 x86-64 可以做到粗粒度控制与细粒度控制的转换,却是一个巧妙的做法。 RISC-V 设计人员引入了叶 PTE 与非叶 PTE 的概念,并使用 R W X 这三个位域来定义,从而将页表的层级 (level) 和它是指向页表还是仅包含物理地址区分开来,使得每个层级的 PTE 都可以是叶 PTE,既实现了粗细粒度控制,又可以防止上层页表控制下层页表。例如,在 Sv39 中,若第二级页表就是叶 PTE,那么就会形成一个大小为 2 M 的超级页,相比于 4 KB 更粗粒度。

地址转换过程

RISC-V Sv39 分页机制中关于虚拟地址的翻译/转换过程:

  1. 定义 a = s a t p . b a s e p p n × P A G E S I Z E a = satp.baseppn × PAGESIZE a=satp.baseppn×PAGESIZE ,且定义 i = L E V E L S − 1 i = LEVELS − 1 i=LEVELS1
  2. 定义 pte 指向地址为 a + v a . v p n [ i ] × P T E S I Z E a +va.vpn[i]×PTESIZE a+va
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值