# Day3 Virtual Memory Layout on RISC-V Linux

星期日,感觉是个适合算数的好日子,所以今天的文件,就决定是你了 Virtual Memory Layout on RISC-V Linux

文件

=============================
RISC-V Linux 的虚拟记忆体布局
=============================

:Author: Alexandre Ghiti <[email protected]>
:Date: 12 February 2021

这份文件描述 RISC-V Linux 核心的虚拟记忆体布局。

32 位元 RISC-V Linux 核心
=========================

32 位元 RISC-V Linux 核心
------------------------

待完成

64 位元 RISC-V Linux 核心
=========================
RISC-V 的特权架构文件描述 64 位元长度的位址
"必须让第 63-48 位都等於第 47 位,否则会发生分页错误中断。"
而这表示有一个巨大的记忆体"孔洞"将虚拟记忆体空间分成两半,
下半部是使用者空间所在的位址,上半部则是 RISC-V Linux 核心所使用的位址。

RISC-V Linux Kernel SV39
------------------------

https://ithelp.ithome.com.tw/upload/images/20210912/20141136sXEjeJIz7o.png

我的理解

  • RISC-V 特权架构规范(Privilege Specification)定义了 3 种不同的虚拟记忆体分页机制(Paging),分别是 32 bit 核心的 SV32,支援 32 bit 的虚拟记忆体位址空间(virtual memory space);还有 64 bit 核心的 SV39 和 SV48,分别支援 39 bit 和 48 bit 的虚拟记忆体位址空间。
    • 需要注意的是,原文件中 RISC-V Linux Kernel 64 bit 的内文是引用 SV48 的文句;而记忆体的布局(layout) 则是以 SV39 为例。
  • 记忆体布局表格中提到的 different per mm,这里的 mm 指的应该是核心中使用到的资料结构 (data structure) struct mm,这个资料结构是用来描述不同程序(process)所使用的记忆体空间(memory space)。
  • 记忆体布局有提到的一些专有名词,像是 kasanfixmapvmalloc/ioremapvmemmap 等等,都是核心内部使用到的不同技术,也分别有不同的文件来做介绍,这边就不详加赘述了,有机会另辟新文再来做纪录。(因为笔者自己也没有很清楚每一项的功能XDDD)
  • 本文一开始有提到算数,是指笔者有将每一个记忆体布局中的起始位址、终端位址,拿来计算,看看是否与大小吻合,结果还真的发现感觉有些问题的地方。(笔者的组长约莫於 1 个月前有向同组组员们提及这份文件有出错XDD)
    • 原文中 ffffffe000000000 | -128 GB | ffffffff7fffffff | 124 GB | direct mapping of all physical memory 这一个区段,拿 ffffffff7fffffff - ffffffe000000000 计算出来的大小应该是 126 GB
    • 不过若是 126 GB 的话,和接下来的区段并不吻合,所以正确的应该是:
      • 大小还是 124 GB
      • 但是 End Addr 的值要改成 fffffffeffffffff

Patch time

$ git send-email --to [email protected] \
                 --to [email protected] \
                 --to [email protected] \
                 --to [email protected] \
                 --to [email protected] \
                 --to [email protected] \
                 --cc [email protected] \
                 --cc [email protected] \
                 *.patch
# *.patch ==  0001-doc-Fix-typo-in-Documentation-riscv-vm-layout.patch,0002-docs-zh_TW-Add-translation-for-riscv-vm-layout.patch                                

那我们一样明天见啦~


<<:  Day12 Docker File

>>:  Day 8 - 拯救落後的专案能撑一天是一天(後端篇)

Day14 上上下下左左右右 & 世代差异的沟通术

如果你看到标题秒懂而且联想到梁家辉的话,我只能说,你一定是一个擅长沟通的好PM。 谈到团队内沟通,跟...

[ Day 07 ] Class Component

上一篇介绍了元件和 React Component 其中之一的 Function Componen...

产品成长策略 - 安索夫矩阵

一家公司很难单靠一个产品来获利,就像 原来产品也有自己的生命历程 Product Life Cycl...

【Day20】 WavenetGan, BidirectionalLSTMGAN, WaveGan 钢琴音乐生成

因为之後想花一点时间分享一下 Transformer 阅读跟实作的经验,所以这篇就没写 Trans...

30天轻松学会unity自制游戏-制作Boom

之前Boss生产小兵有个小问题,如果你场景做很大,Boss会在後面一直生产小兵,可能你到Boss时,...