RISCV MMU 概述

2023-05-16

1. 背景简介

Linux 内存管理包含很多内容,主要知识点可以参考 Linux Mem。本文只描述其中的一个知识点 Paging and MMU

本文以全志 D1 为例,包含了平头哥出品的一颗 Riscv64 的 CPU IP-Core,代号 C906。具体手册可以参考 C906 用户手册。

2. X86_64

同样是 64bit cpu,x86_64 支持 48bit 和 57bit 两种线性地址模式,分别对应 4level 和 5level mmu 映射:

线性地址mmu 层级Linux user address spaceLinux kernel address space
Sv48 (48bit)4level: pgd→pud→pmd→pte→page(4k)0x00000000 00000000 - 0x00007FFF FFFFFFFF0xFFFF8000 00000000 - 0xFFFFFFFF FFFFFFFF
Sv57 (57bit)5level: pgd→p4d→pud→pmd→pte→page(4k)0x00000000 00000000 - 0x00FFFFFF FFFFFFFF0xFF000000 00000000 - 0xFFFFFFFF FFFFFFFF

X86_64 使用 CR3 寄存器来保存 MMU 映射表的根地址。

更详细信息可以参考 分页寻址(Paging)机制详解 和 内核地址空间布局详解。

3. C906

Sv39/Sv48/Sv57/Sv64 这几种模式 riscv64 都支持。因为 C906 设计的应用场景不需要那么多的内存资源,目前 C906 只支持 Sv39 模式,对应 3level mmu 映射。

线性地址mmu 层级Linux user address spaceLinux kernel address space
Sv39 (39bit)3level: pgd→pmd→pte→page(4k)0x00000000 00000000 - 0x0000003F FFFFFFFF0xFFFFFFC0 00000000 - 0xFFFFFFFF FFFFFFFF

和 x86 CR3 类似,riscv 使用 SATP 寄存器来保存 MMU 映射表的根地址。具体的映射关系如下:
在这里插入图片描述

3.1 SATP 寄存器

SATP 寄存器的具体格式如下图所示:
在这里插入图片描述

具体字段的解析如下:

  • Mode - MMU 地址翻译模式
ValueNameDescription
0BareNo translation or protection
1-7-Reserved
8Sv39Page-based 39-bit virtual addressing
9Sv48Page-based 48-bit virtual addressing
10Sv57Reserved for page-based 57-bit virtual addressing
11Sv64Reserved for page-based 64-bit virtual addressing
12-15-Reserved

当 Mode 为 0 时,MMU 关闭。C906 只支持 MMU 关闭和 Sv39 两种模式。

  • ASID – 当前 ASID。表示当前程序的 ASID 号。
  • PPN – 硬件回填根 PPN。第一级硬件回填使用的 PPN (Phsical Page Number)。

3.2 页表表项

pgd/p4d/pud/pmd/pte 每级页表中包含的表项大小都是 8 bytes,每个 4k page 内存只能容纳 512 个页表项,所以每级页表的寻址范围为 9bit。

c906 具体的页表表项格式如下所示:
在这里插入图片描述
具体字段的解析如下:

  • PPN – 页表物理地址。PPN[i] 分别代表三级页表转换时所对应的 PPN 值。

  • RSW – Reserved for Software。用于预留给软件做自定义页表功能的位。default 为 2’b0。

  • D – Dirty
    D 位为 1 时,表明该页是否被改写。
    1’b0: 当前页未被写/不可写;
    1’b1: 当前页已经被写/可写。
    此位在 C906 的硬件实现与 W 属性类似。当 D 位为 0 时,对此页面进行写操作会触发 Page Fault (store)
    异常,通过在异常服务程序中配置 D 位来维护该页面是否已经被改写/可写的定义。该位复位为 0。

  • A – Accessed
    A 位为 1 时,表明该页被访问过。为 0 时表示没被访问过,对该页表的访问会触发 Page Fault (对应访问
    类型) 异常且将该域置为 1。该位复位为 0。

  • G – Global
    全局页面标识,当前页可供多个进程共享,该位复位为 0。
    1’b0: 非共享页面,进程号 ASID 私有;
    1’b1: 共享页面。

  • U – User
    用户模式可访问,该位复位为 0。
    1’b0: 用户模式不可访问,当用户模式访问,出 page fault 异常;
    1’b1: 用户模式可访问。

  • X :可执行;W :可写;R :可读。

XRW 权限说明

XWRMeaning
000Pointer to next level of page table
001Read-only page
010Reserved for future use
011Read-write page
100Execute-only page
101Read-execute page
110Reserved for future page
111Read-write-execute page

违反 XWR 权限时将会触发 Page Fault 异常。

  • V – Valid
    表明物理页在内存中是否分配好,访问一个 V 为 0 的页面,将触发 Page Fault 异常。该位复位为 0。
    1’b0: 当前页没有分配好;
    1’b1: 当前页已分配好。

C906 扩展页面属性如下

  • SO– Strong order
    用于表示内存对访问顺序的要求:
    1’b0: no strong order(Normal-memory);
    1’b1: strong order(Device)。
    默认是 no strong order。

  • C – Cacheable
    1’b0: Non-cacheable;
    1’b1: Cacheable。
    默认是 Non-cacheable。

  • B – Buff er
    1’b0: Non-bufferable ;
    1’b1: Bufferable 。
    默认是 Non-bufferable 。

  • Sec (T – Trustable)
    用于表征页面属于可信世界或者非可信世界,该位仅在配有 TEE 扩展时有意义,C906 中该位未定义。
    1’b0: Non-trustable;
    1’b1: Trustable;
    默认是 Trustable。

3.3 Huge Page

x86 的页表表项中使用了一个 PS 位来标识当前是不是 huge page,如果设置了这个 bit,那么 pud 能直接寻址 1G 的大页,pmd 能直接寻址 2M 的大页。
在这里插入图片描述
c906 的表项中并没有 PS 这个 bit,它是用 XRW 3 个 bit 的组合来标识当前是不是最后一级页表的。

  • 如果 XRW = 000,则是中间一级页表
  • 如果 XRW != 000,则是最后一级页表。pgd 为 1G 大页,pmd 为 2M 大页。

3.4 ASID

ASID (Adress Space ID) 的主要目的是给 mmu 缓存到 tlb 时打标签用的,如果页表表项中设置了 G – Global 则是全局的不受 ASID 的约束。

在 Linux 中每个用户进程拥有自己的地址空间,拥有一套独立的 mmu 映射关系。所以在进程切换时 mmu 映射也需要切换。

ASID 作用主要有两个:

  • 减少 tlb 的全局刷新。
  • 在不刷新的情况下做权限隔离。

ASID 的详细原理可以参考:内核页表隔离 (KPTI) 详解 。

4. Linux 对 mmu 的常用操作

linux 在以下场景下会对mmu 进行操作,这里就不详细展开:

scenedescription
fork()简单复制 mmu 映射关系
execv()重新创建用户态 vma 映射
mmap()创建一段新的 vma 映射
task_switch切换不同地址空间的 mmu 映射
page_fault()根据 vma 映射创建实际的 mmu 映射
mprotect()更改 vma 和 mmu 的内存属性
system call在开启 KPTI 的情况下,会发生 mmu 切换
mem reclaim在回收文件内存以后,销毁对应 mmu 映射

参考文档

1.C906 用户手册
2.分页寻址(Paging)机制详解
3.内核地址空间布局详解
4.commit:RISC-V: Paging and MMU
5.内核页表隔离 (KPTI) 详解

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RISCV MMU 概述 的相关文章

  • 吃透Chisel语言.10.Chisel项目构建、运行和测试(二)——Chisel中生成Verilog代码&Chisel开发流程

    Chisel项目构建 运行和测试 二 Chisel中生成Verilog代码 Chisel开发流程 上一篇文章我们提到了怎么用sbt构建Chisel项目并运行Chisel代码 但是毕竟还是在电脑上运行的 而在实践中 我们写的Chisel代码最
  • MIT 6.s081学习笔记

    MIT 6 s081学习笔记 introduction 计算机组织结构 最底部是一些硬件资源 包括了CPU 内存 磁盘 网卡 最上层会运行各种应用程序 比如vim shell等 这些就是正在运行的所有程序 它们都运行在同一个空间中 这个空间
  • 和你一起从零开始写RISC-V处理器(1)

    RISC V加法指令的实现 文章目录 RISC V加法指令的实现 前言 一 RISC V简介 二 指令实现的前期准备 1 指令 2 ADD指令和ADDI指令 3 三级流水线结构 4 一个需要注意的点 5 再来一个需要注意的点 6 环境搭建
  • 基于RISC-V架构的45条指令单周期CPU设计——第1章

    完整目录 完整代码和论文 指令选取 前言 本次设计选取 RV32I 和 RV32M 大部分可实现的指令 其中囊括 R 型 I 型 U 型 S 型 B 型 J 型指令 R 型指令 R 型指令格式 I 型指令 I 型指令格式 U 型指令 U 型
  • RISCV核设计与Chisel语言入门资料

    RISCV SOC设计与Chisel语言入门资料 关于项目的一点说明 Rocket核与Chisel语言 关于项目的一点说明 今年三月 我和舍友一起参加了第四届全国集成电路设计大赛 选择了RISCV挑战杯的子赛题二网址 自二月份开始着手做该项
  • 吃透Chisel语言.09.Chisel项目构建、运行和测试(一)——用sbt构建Chisel项目并运行

    Chisel项目构建 运行和测试 一 用sbt构建Chisel项目并运行 上一大部分介绍了Chisel的基础语法 但除了教程开始的Demo以外 我们还没有开始写Chisel代码 这对于学习编程语言来说是大忌 不过好在Chisel基础语法部分
  • Chisel 手册(中文part1)

    Chisel 手册 part1 作者 Jonathan Bachrach Huy Vo Krste Asanovi EECS Department UC Berkeley 译者 智能物联 CSDN 1 简介 本文为Chisel手册 Cons
  • RISC-V IDE MounRiver Studio相较Eclipse GNU的区别与改进

    RISC V单片机集成开发环境 IDE MounRiver Studio相较Eclipse GNU的区别与改进 一 界面与功能区别 1 欢迎页 MounRiver Studio www mounriver com 左侧为工程操作及帮助文档快
  • RISC-V嵌入式开发准备篇2:嵌入式开发的特点介绍

    原文出处 https mp weixin qq com s ljYZwMj3JaPN29dTAXA3bQ 随着国内第一本RISC V中文书籍 手把手教你设计CPU RISC V处理器篇 正式上市 越来越多的爱好者开始使用开源的蜂鸟E203
  • 基于rCore的试点班lab1 实现一个系统调用

    实现一个属于你的系统调用 并写一个用户进程来调用该系统调用 该系统调用的功能为 输出你的名字 拼音即可 和学号 相关知识 系统调用 是操作系统提供给应用程序使用的接口 可以理解为一种可供应用程序调用的特殊函数 应用程序可以发出系统调用请求来
  • 如何使用 LLVM/Clang 编译为 RISC-V 目标?

    我想将一个简单的程序 int main return 0 编译到RISC V处理器 LLVM Clang 版本是 9 0 我想用这样的 RISC V 模拟器运行编译后的程序https github com riscv riscv tools
  • MTRR寄存器如何实现? [关闭]

    Closed 这个问题是无关 目前不接受答案 x86 x86 64 公开了 MTRR 内存类型范围寄存器 可用于为不同用途指定物理地址空间的不同部分 例如 可缓存 不可更改 写入组合等 我的问题是 有人知道 MTRR 定义的物理地址空间限制
  • 使用 Clang 为 RISC-V 进行编译

    我正在尝试使用构建一个 hello world 程序Clang 版本 12 0 1 适用于 RISC V 架构 我已经安装了它LLVM 版本 12 0 1 具有以下设置 cmake G Unix Makefiles DLLVM ENABLE
  • RISC-V 使用 LUI 和 ADDI 构建 32 位常量

    LUI 加载立即数 用于构建32位常量并使用U型格式 LUI 将 U 立即数放入目标寄存器 rd 的高 20 位 并用零填充最低 12 位 我在手册中找到了这个 但是如果我想将 0xffffffff 移动到寄存器 我需要的所有代码是 LUI
  • 为什么 RV64 为 32 位操作而不是 64 位操作引入新的操作码

    在浏览 RISC V 规范时 我注意到 64 位版本与 32 位版本的不同之处在于 它 将寄存器扩展至 64 位 更改了指令以作用于整个 64 位范围 添加了执行 32 位操作的新指令 这使得 RV32 代码与 RV64 不兼容 但是 如果
  • 裸机 RISC-V CPU - 处理器如何知道从哪个地址开始获取指令?

    我正在设计自己的 RISC V CPU 并且已经能够实现一些指令代码 我已经安装了 RV32I 版本的 GCC 编译器 所以我现在有了汇编器riscv32 unknown elf as可用的 我正在尝试仅用一条指令来汇编一个程序 simpl
  • 逻辑地址和物理地址之间的区别?

    我正在阅读 操作系统概念 现在正在读第 8 章 不过 我可以做一些澄清 或者保证我的理解是正确的 逻辑地址 根据书中所述 逻辑地址是由CPU生成的 这到底是什么意思 在执行生成的地址系统中 我假设当为程序编译代码时 该程序具有no知道代码将
  • 记录内存访问足迹

    I found mtrace https github com aclements mtrace克莱门茨博士 虽然很有用 但是在我需要的情况下却不能正常工作 我打算使用该记录来了解不同场景下的内存访问模式 有人可以分享相关经验吗 任何建议将
  • 数组和结构体可以以不同的方式初始化吗?

    我的问题可能看起来很奇怪 事实上 这是上下文 我目前在切换时遇到一个奇怪的问题 关于我正在从事的项目 核心从pullinino到CV32 也发生了一些其他变化 例如关于crt0 如一些数据内存重置 这是一个 真实的 例子 说明了一个非常简单
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以

随机推荐

  • jetson xavier和NX 以及nano如何通过sd卡启动,sdkManager刷机

    1 xff0c xavier可以通过迁移系统的方法进行 Jetson AGX Xavier从SD卡启动系统及系统移植 xavier AGX不能直接使用sdkManager刷机到SD卡 xff0c 所以需要用系统迁移的方法 2 xff0c N
  • Linux NameSpace (目录)

    1 User Namespace 详解 2 Pid Namespace 详解 3 Mnt Namespace 详解 4 UTS Namespace 详解 5 IPC Namespace 详解 6 Network Namespace 详解
  • Python Nose 自动化测试框架介绍

    文章目录 1 unittest 简介1 1 python 单元测试1 2 unittest 测试框架1 3 默认模式1 4 手工模式 2 nose 扩展框架2 1 96 nose 96 的安装和基本用法2 2 96 被测对象 96 的扩展2
  • TLSF 内存分配算法详解

    文章目录 1 DSA 背景介绍1 1 mmheap1 2 mmblk 2 TLSF 原理2 1 存储结构2 2 内存池初始化2 3 free2 4 malloc 参考资料 1 DSA 背景介绍 动态内存管理算法 DSA xff0c Dyna
  • 史上最全采样方法详细解读与代码实现

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 欢迎大家star xff0c 留言 xff0c 一起学习进步 1 什么是采样 在信号系统 数字信号处理中
  • Linux Kdump 机制详解

    文章目录 1 简介1 1 安装1 2 触发 kdump1 3 调试 kdump1 3 1 安装 debuginfo vmlinux1 3 2 编译 kernel 1 4 kdump tools service 流程分析 2 原理分析2 1
  • Buildroot 用户手册 (中文)

    文章目录 I Getting started1 About Buildroot2 System requirements2 1 Mandatory packages2 2 Optional packages 3 Getting Buildr
  • 正则表达式 (学习笔记)

    正则表达式的难度不在于难懂 xff0c 而在于对它的表述没有恰当的分类和组织 xff0c 所以弄得很零散难以记忆 按照自己的理解和归纳记录一份笔记 xff0c 以备遗忘时查看 正则表达式 regular expressions 是一种用来匹
  • Linux usb 2. 协议分析

    文章目录 0 背景1 USB 协议传输格式1 1 Packet1 1 1 Token Packet1 1 2 Data Packet1 1 3 Handshake Packet1 1 4 Special Packet 1 2 Transac
  • RISCV 入门 (学习笔记)

    文章目录 1 risv 相关背景1 1 arm 授权费1 2 riscv 发展历史1 3 riscv 风险 2 指令集2 1 可配置的通用寄存器组2 2 规整的指令编码2 3 简洁的存储器访问指令2 4 高效的分支跳转指令2 5 简洁的子程
  • Linux usb 1. 总线简介

    文章目录 1 USB 发展历史1 1 USB 1 0 2 01 2 USB 3 01 3 速度识别1 4 OTG1 5 phy 总线1 6 传输编码方式 2 总线拓扑2 1 Device 内部的逻辑关系2 2 Compound Compos
  • Linux usb 3. Host 详解

    文章目录 1 简介2 Usb Core 驱动设备模型2 1 Usb Device Layer2 1 1 device struct usb device 2 1 2 driver struct usb device driver 2 1 3
  • Linux usb 4. Device 详解

    文章目录 1 简介2 Platform Layer2 1 Platform Device2 2 Platform Driver 3 UDC Gadget Layer3 1 Gadget Bus3 2 Gadget Device3 2 1 E
  • Linux USB (目录)

    1 USB 总线简介 2 USB 协议分析 3 USB Host 详解 4 USB Device 详解 5 usbip USB Over IP 使用实例 6 USB HC UDC 测试 7 Linux 配置 ADBD
  • Linux usb 5. usbip (USB Over IP) 使用实例

    文章目录 0 简介1 Server 配置2 Client 配置参考资料 0 简介 USB Over IP 是一种应用很多的场景 xff0c 目前已经有现成的解决方案 usbip linux 和 windows 环境下都有配套软件 xff0c
  • 最全随机抽样算法(从N个数中抽取M个等)集合

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 欢迎大家star xff0c 留言 xff0c 一起学习进步 1 从N个数中等概率抽取M个数 从N个样本
  • Linux usb 6. HC/UDC 测试

    文章目录 1 背景介绍2 Device gadget zero 2 1 96 gadget zero 96 创建2 2 SourceSink Function2 3 Loopback Function 3 Host usbtest ko 3
  • Linux usb 7. Linux 配置 ADBD

    文章目录 1 简介2 ADBD 源码3 Gadget Device 配置3 1 functionfs3 2 legacy 方式配置 functionfs3 3 configfs 方式配置 functionfs3 4 adb 使用配置 参考资
  • HW-RTOS 概述

    文章目录 1 背景介绍1 1 OS 实时难题1 2 Linux 实时补丁1 3 Xenomai 43 Linux 双内核1 4 HW RTOS1 5 More 2 优化点1 xff1a API2 1 原理介绍2 1 1 Software A
  • RISCV MMU 概述

    1 背景简介 Linux 内存管理包含很多内容 xff0c 主要知识点可以参考 Linux Mem 本文只描述其中的一个知识点 Paging and MMU 本文以全志 D1 为例 xff0c 包含了平头哥出品的一颗 Riscv64 的 C