RISCV Linux 虛擬內存精講系列一 Sv39

? ? ? ? 筆者認為,Linux 操作系統(Operating System)最核心的機制是虛擬內存(Virtual Memory)。因為,操作系統主要作用是將硬件環境抽象起來,給在其中運行的應用(Applications)提供一個統一的、抽象的運行環境(Execution Environment),使得應用(Applications)專注于為用戶提供各種各樣的業務邏輯(Business Logics)。其中,虛擬內存提供了核心的支撐作用。

? ? ? ? 從下(底層,baremetal)往上看,運行的程序與外界交互,主要是與主存(Main Memory)、外圍設備(Peripheral Devices)交互(Access,Read/Write,IO)都是通過對其對應的地址(Addresses)進行讀寫操作(Read/Write Operations)來實現的。

? ? ? ? 而操作系統為了統一管理與外界的交互,使得,在操作系統上運行的應用(Applications)需要間接地(Indrectly)實現地址的訪問,也就是通過操作系統來實現交互。那么,虛擬內存就提供了這么一個機制,通過不同的頁表(Page Table)為每個應用提供一個獨立的地址空間(Address Space),然后,該地址空間的地址,通過對應的頁表,轉換成實際的物理地址(Physical Address),從而,對外界進行訪問。

? ? ? ? 這里所說的虛擬地址(Virtual Address, VA),主要指的 CPU load/store/branch 等指令所使用的地址。而物理地址(Physical Address, PA),主要指的是SoC上的總線地址,即經過總線的路由(Routing)后,指派到對應的設備上。

? ? ? ? 也就是說,在沒有虛擬地址轉換時,虛擬地址等于物理地址。

? ? ? ? 基于上述概念,以 RISCV Linux 以及 RISCV Sv39 為例,通過一系列的文章,詳細地梳理清楚 在 RISCV Sv39 上,Linux 是如何實現其虛擬內存機制的。

? ? ? ? (順便提一句,vmlinux 中的 vm,就是 virtual memory 的縮寫)

? ? ? ? 這是該系列的第一篇文章,主要講述 RISCV Sv39。

? ? ? ? RISCV Sv39 指 64 位的 RISCV CPU 中,其有效虛擬地址位數為 39 位,也就是有效位(Effective bits)為 0 - 38,另,39 - 64 的值與 bit 38 一樣。也就是 Two's Complement 的計數方式,方便地址的計算與劃分。

The RISC-V Instruction Set Manual: Volume II Privileged Architecture. P 11.4.

????????Instruction fetch addresses and load and store effective addresses,which are 64 bits, must have bits 63–39 all equal to bit 38, or else a page-fault exception will occur.

????????The 27-bit VPN is translated into a 44-bit PPN via a three-level page table, while the 12-bit page offset is untranslated.

? ? ? ? 即,根據RISCV Sv39 規定,39位有效虛擬地址被劃分為4段,高位三段為虛擬頁表索引號(Virtual Page Number),低12位為 頁表偏移量(Page Offset)。

? ? ? ? 另外,Sv39 規定,物理地址有效位數為 56 位,即 0 - 55。如下:

? ? ? ? 另外,頁表項 PTE (Page Table Entry) 的設計,如下:

? ? ? ? 這里需要注意的是,在RISCV 64 位的CPU角度上看,其訪問的地址(Virtual Address)是64位的。當 CPU 中的虛擬地址轉換模式(Virtual Address Translation Mode)被選定后,如 Sv39,那么,64位的CPU訪問地址(CPU Access Virtual Address),將裝換成虛擬地址轉換模式指定的虛擬地址,如 Sv39 虛擬地址 (Sv39 Virtual address)。其轉換規則由其轉換模式規定,如Sv39 規定,低39位CPU訪問地址有效,高位值必須等于 bit 38,類似符號擴展(sign extension)。基于,轉換模式,可以找到其對應的虛擬地址轉換模式指定的物理地址,如 Sv39 物理地址(Sv39 Physical Address),56位有效位的物理地址。然后,通過 0 擴展模式(zero extension)將其裝換成機器級(machine level)物理地址(physical address),也就是上面所說的SoC總線地址(Bus Address)。

? ? ? ? 也就是,從CPU角度出發,地址的轉換如下:

虛擬地址(Virtual Address, VA)/?CPU訪問地址(CPU Access Virtual Address)/ 邏輯地址(Logical Address )

-- 符號擴展(sign extension)--

????????==>?Sv39 虛擬地址 (Sv39 Virtual address)(VPN + Page Offset)

-- 虛擬地址轉換模式 --

????????==>?Sv39 物理地址(Sv39 Physical Address)(PPN + Page Offset)

-- 0 擴展模式(zero extension)--

????????==> 機器級(machine level)物理地址(physical address, PA)/?SoC總線地址(Bus Address)

????????通過 S mode 下的 satp 控制狀態寄存器(Control Status Register, CSR),設定虛擬地址轉換模式,如 Sv39,即物理根頁表號(Root PPN),如下:

? ? ? ? 其轉換過程如下:

? ? ? ? 其中,虛擬地址到物理地址的轉換過程,大致如下:(在不考慮PTE屬性的情況下)

#define XLEN (64) // 64 bits RISCV CPU
#define BITS_IN_BYTE (8) // 1 Byte = 8 bits
#define SATP_PPN_MASK (0x0fff'ffff'ffff)
#define PAGE_SIZE_BITS (12) // 4KB per page
#define PAGE_SIZE (1 << PAGE_SIZE_BITS)
#define PTE_SIZE (XLEN / BITS_IN_BYTE) // 8 Bytes per PTE
#define PTE_ENTRIES_PER_PAGE (PAGE_SIZE / PTE_SIZE) // 512 entries per page
#define Level_0_VA_OFFSET_BITS (PAGE_SIZE_BITS + 9 + 9)
#define Level_1_VA_OFFSET_BITS (PAGE_SIZE_BITS + 9)
#define Level_2_VA_OFFSET_BITS (PAGE_SIZE_BITS)PTE* level_0_page_table = (satp & SATP_PPN_MASK) << PAGE_SIZE_BITS
PTE* level_1_page_table = level_0_page_table[(va >> (Level_0_VA_OFFSET_BITS)) & (512 - 1)]
PTE* level_2_page_table = level_1_page_table[(va >> (Level_1_VA_OFFSET_BITS)) & (512 - 1)]
PTE* leaf_PTE = level_2_page_table[(va >> (Level_2_VA_OFFSET_BITS)) & (512 - 1)]
void * pa = leaf_PTE.ppn << Level_2_VA_OFFSET_BITS + (va & (1 << Level_2_VA_OFFSET_BITS - 1))

? ? ? ? 具體的轉換過程,請參考官方手冊。

? ? ? ? 其中,當 PTE 在 level_0_page_table 時,就是 葉表項(leaf_pte),那么該 PTE 描述的 1GB的空間(30 Bits),即

#define XLEN (64) // 64 bits RISCV CPU
#define BITS_IN_BYTE (8) // 1 Byte = 8 bits
#define SATP_PPN_MASK (0x0fff'ffff'ffff)
#define PAGE_SIZE_BITS (12) // 4KB per page
#define PAGE_SIZE (1 << PAGE_SIZE_BITS)
#define PTE_SIZE (XLEN / BITS_IN_BYTE) // 8 Bytes per PTE
#define PTE_ENTRIES_PER_PAGE (PAGE_SIZE / PTE_SIZE) // 512 entries per page
#define Level_0_VA_OFFSET_BITS (PAGE_SIZE_BITS + 9 + 9)
#define Level_1_VA_OFFSET_BITS (PAGE_SIZE_BITS + 9)
#define Level_2_VA_OFFSET_BITS (PAGE_SIZE_BITS)PTE* level_0_page_table = (satp & SATP_PPN_MASK) << PAGE_SIZE_BITS
PTE* leaf_PTE = level_0_page_table[(va >> (Level_0_VA_OFFSET_BITS)) & (512 - 1)]
void * pa = leaf_PTE.ppn << Level_0_VA_OFFSET_BITS + (va & (1 << Level_0_VA_OFFSET_BITS - 1))

? ? ? ? 同理,當 PTE 在 level_1_page_table 時,就是 葉表項(leaf_pte),那么該 PTE 描述的 2MB的空間(21 Bits),即

#define XLEN (64) // 64 bits RISCV CPU
#define BITS_IN_BYTE (8) // 1 Byte = 8 bits
#define SATP_PPN_MASK (0x0fff'ffff'ffff)
#define PAGE_SIZE_BITS (12) // 4KB per page
#define PAGE_SIZE (1 << PAGE_SIZE_BITS)
#define PTE_SIZE (XLEN / BITS_IN_BYTE) // 8 Bytes per PTE
#define PTE_ENTRIES_PER_PAGE (PAGE_SIZE / PTE_SIZE) // 512 entries per page
#define Level_0_VA_OFFSET_BITS (PAGE_SIZE_BITS + 9 + 9)
#define Level_1_VA_OFFSET_BITS (PAGE_SIZE_BITS + 9)
#define Level_2_VA_OFFSET_BITS (PAGE_SIZE_BITS)PTE* level_0_page_table = (satp & SATP_PPN_MASK) << PAGE_SIZE_BITS
PTE* level_1_page_table = level_0_page_table[(va >> (Level_0_VA_OFFSET_BITS)) & (512 - 1)]
PTE* leaf_PTE = level_1_page_table[(va >> (Level_1_VA_OFFSET_BITS)) & (512 - 1)]
void * pa = leaf_PTE.ppn << Level_1_VA_OFFSET_BITS + (va & (1 << Level_1_VA_OFFSET_BITS - 1))

? ? ? ? 那么,基于 RISCV Sv39 的虛擬地址轉換模式大致上如上所示。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87914.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【apply from: “$flutterRoot/packages/flutter_tools/gradle/flutter.gradle“作用】

這行代碼的作用是將 Flutter 的 Gradle 構建腳本集成到 Android 項目中&#xff0c;具體細節如下&#xff1a;作用解析&#xff1a;引入 Flutter 構建邏輯 flutter.gradle 是 Flutter SDK 的核心構建腳本&#xff0c;它負責&#xff1a; 編譯 Dart 代碼為原生二進制文件&#x…

深入理解JavaScript設計模式之命令模式

深入理解JavaScript設計模式之命令模式 文章目錄深入理解JavaScript設計模式之命令模式定義簡單命令模式組合命令模式使用命令模式實現文本編輯器目標關鍵類說明實現的效果交互邏輯流程所有代碼&#xff1a;總結定義 命令模式也是設計模式種相對于變焦簡單容易理解的一種設計模…

CSS 網頁布局:從基礎到進階

CSS 網頁布局&#xff1a;從基礎到進階 引言 隨著互聯網的飛速發展&#xff0c;網頁設計已經成為了一個不可或缺的領域。CSS&#xff08;層疊樣式表&#xff09;作為網頁設計中的關鍵工具&#xff0c;用于控制網頁元素的樣式和布局。本文將為您全面解析CSS網頁布局&#xff0c;…

【人工智能】大語言模型(LLM) NLP

大語言模型&#xff08;LLM&#xff09;& NLP1.大語言模型&#xff08;LLM&#xff09;1.1 一句話解釋1.2 更形象的比喻1.3 為什么叫 “大” 模型1.4 它能做什么1.5 現實中的例子2.對比 NLP2.1 用 “汽車進化” 比喻 NLP → LLM2.2 為什么說 LLM 屬于 NLP2.3 LLM 的 “革命…

Unity HDRP + Azure IoT 的 Python 后端實現與集成方案

Unity HDRP Azure IoT 的 Python 后端實現與集成方案 雖然Unity HDRP本身使用C#開發&#xff0c;但我們可以構建Python后端服務支持物聯網系統&#xff0c;并與Unity引擎深度集成。以下是完整的實現方案&#xff1a; 系統架構 #mermaid-svg-qCDb0g9Ik287Cg8X {font-family:&qu…

小黑黑日常積累大模型prompt句式2:【以段落的形式輸出,不分點列舉】【如果沒有相關內容則不輸出】【可讀性強】【輸出格式規范】

以段落的形式輸出&#xff0c;不分點列舉 每個標題下直接接續段落內容&#xff0c;不編號、不分點。......標題下直接接續段落內容&#xff0c;不繼續進行分點列舉。如果沒有相關內容則不輸出 若某一部分無法從原文中提取有效信息&#xff0c;則跳過該部分內容&#xff0c;不做…

React Native 基礎組件詳解<一>

一、Text組件 1&#xff09;numberOfLines&#xff1a;顯示行數 2&#xff09;ellipsizeMode&#xff1a;超出隱藏的位置 clip->裁掉 head/middle/ tail->點的位置 3&#xff09;selectable: 是否可以選中 4&#xff09;selectionColor&#xff1a;選中后的顏色 5&#…

異步編程(Promise/Generator/async)

1、Promise 2、Generator 3、async/await

【Note】《Kafka: The Definitive Guide》 第8章: Cross-Cluster Data Mirroring

《Kafka: The Definitive Guide》 第8章&#xff1a; Cross-Cluster Data Mirroring 一、跨集群鏡像的場景與價值 多區域低延遲訪問 將業務數據從主集群實時復制到多個地理區域的集群&#xff0c;縮短消費者跨區讀取延遲。 災備切換 當主集群出現故障時&#xff0c;可快速將消…

「Windows/Mac OS」AIGC圖片生成視頻 ,webui + stable-diffusion環境部署教程

stable-diffusion webui 環境搭建目錄 一、Windows 環境部署 stable-diffusion-webui1、準備條件2、安裝Python 3.10.X&#xff08;**較新版本的 Python 不支持 torch**&#xff09;3、安裝Git 教程4、使用Git 下載 stable-diffusion-webui 存儲庫&#xff0c;4.1、顯示報錯 5…

【深度學習】 深度學習訓練配置參數詳解

深度學習訓練配置參數詳解 1. 啟動初始化參數說明CUDA_VISIBLE_DEVICES指定使用的GPU設備編號&#xff08;"0"表示單卡&#xff09;seed隨機種子&#xff08;1777777&#xff09;&#xff0c;保證實驗可復現性cuda是否啟用GPU加速&#xff08;True&#xff09;benchm…

期望,積分,均值,求和的關系

1. 回顧期望的定義 對于連續性隨機變量 X X X&#xff0c;期望為&#xff1a; E X ~ f ( x ) [ X ] ∫ Ω x f ( x ) d x E_{X\sim f(x)}[X] \int_{\Omega}xf(x)dx EX~f(x)?[X]∫Ω?xf(x)dx 其中 f ( x ) f(x) f(x)為概率密度函數&#xff0c; Ω \Omega Ω為概率密度函…

1.如何對多個控件進行高效的綁定 C#例子 WPF例子

使用ObservableCollection高效為多個控件綁定數據在WPF開發中&#xff0c;數據綁定是一個非常重要的功能&#xff0c;它允許我們將UI控件與數據源進行綁定&#xff0c;從而實現數據的自動更新。當需要為多個控件綁定數據時&#xff0c;使用ObservableCollection可以大大提高開發…

JSONLines和JSON數據格式使用教程

文章目錄 一、核心區別二、JSONLines 的優勢三、Python 中使用 JSONLines1. 寫入 JSONLines 文件2. 讀取 JSONLines 文件3. 處理大文件示例四、常見工具支持1. 命令行工具2. 編程語言庫五、適用場景選擇六、注意事項總結JSONLines(簡稱 jsonl 或 jl)和傳統 JSON 都是用于存儲…

鏈表算法之【反轉鏈表】

目錄 LeetCode-206題 LeetCode-206題 給定一個單鏈表的頭節點&#xff0c;請反轉鏈表&#xff0c;并返回反轉后的鏈表 class Solution {public ListNode reverseList(ListNode head) {// checkif (head null || head.next null)return head;// 雙指針ListNode p1 head;Li…

回溯題解——子集【LeetCode】輸入的視角(選或不選)

78. 子集 ? 一、算法邏輯講解&#xff08;逐步思路&#xff09; 邏輯講解&#xff1a; dfs(i)&#xff1a;表示從下標 i 開始&#xff0c;做“選 or 不選”的子集構造。 終止條件 if i n&#xff1a; 到達數組末尾&#xff0c;表示一種完整子集構造完成。 把當前構造路徑…

使用Electron開發跨平臺本地文件管理器:從入門到實踐

在當今數字化時代&#xff0c;文件管理是每個計算機用戶日常工作中不可或缺的一部分。雖然操作系統都提供了自己的文件管理器&#xff0c;但開發一個自定義的文件管理器可以帶來更好的用戶體驗、特定功能的集成以及跨平臺的一致性。本文將詳細介紹如何使用Electron框架構建一個…

JBHI 2025 | 潛在擴散模型賦能胸部X射線骨抑制

Abstract: 肺部疾病是全球健康面臨的一項重大挑戰&#xff0c;胸部 X 光檢查&#xff08;CXR&#xff09;因其方便性和經濟性而成為一種重要的診斷工具。 然而&#xff0c;CXR 圖像中重疊的骨結構往往會阻礙肺部病變的檢測&#xff0c;從而導致潛在的誤診。 為解決這一問題&am…

408第三季part2 - 計算機網絡 - 計算機網絡基本概念

理解然后區分一下這2個區別特點是建立連接存儲轉發的意思是A先發給B&#xff0c;B再發給C&#xff0c;就這樣這里缺點比如A很大&#xff0c;你給B緩存開銷大還需要排序然后形象的圖題目分組頭部要放一些源地址和目的地址這些東西以后發數據只會往近的發&#xff0c;不可能往下面…

互補功率放大器Multisim電路仿真——硬件工程師筆記

目錄 1 互補功率放大器基礎知識 1.1 工作原理 1.2 電路結構 1.3 優點 1.4 缺點 1.5 應用 1.6 總結 2 OCL乙類互補功率放大電路 2.1 電路結構 2.2 工作原理 2.3 優點 2.4 缺點 2.5 總結 3 OCL甲乙類互補功率放大電路 3.1 電路結構 3.2 工作原理 3.3 優點 3.4 …