IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> RISCV MMU 概述 -> 正文阅读

[系统运维]RISCV MMU 概述

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) 详解

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:35:42  更:2022-03-21 21:38:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:47:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码