linux之 內存管理(6)-arm64 內核虛擬地址空間變化

一、新內核變動

? ?????????kernel變化的真快,之前我記得4.x的內核的內核空間的線性映射區位于內核空間的高地址處的128TB,且當前的博客和一些書籍也都還是這樣介紹。可翻了翻kernel的Documentation/arm64/memory.rst文檔,發現最新的kernel已將這128TB移到了內核空間的最低地址處了。具體是2019年8月的一個commit,如下:

commit 14c127c957c1c6070647c171e72f06e0db275ebf
Author: Steve Capper <steve.capper@arm.com>
Date:   Wed Aug 7 16:55:14 2019 +0100arm64: mm: Flip kernel VA spaceIn order to allow for a KASAN shadow that changes size at boot time, onemust fix the KASAN_SHADOW_END for both 48 & 52-bit VAs and "grow" thestart address. Also, it is highly desirable to maintain the samefunction addresses in the kernel .text between VA sizes. Both of theserequirements necessitate us to flip the kernel address space halves s.t.the direct linear map occupies the lower addresses.This patch puts the direct linear map in the lower addresses of thekernel VA range and everything else in the higher ranges.

?二、虛擬地址空間

內核?4.x? 和 5.0 版本的虛擬地址空間分布:

新arm64 內存分布:我的內核版本是5.15

各體系架構處理器的虛擬地址空間的布局各不相同,下面是ARM64位處理器使用48位虛擬地址,4級頁表,頁面大小4KB時的layout:

Start                 End                     Size            Use
-----------------------------------------------------------------------
0000000000000000      0000ffffffffffff         256TB          user
ffff000000000000      ffff7fffffffffff         128TB          kernel logical memory map
ffff800000000000      ffff9fffffffffff          32TB          kasan shadow region
ffffa00000000000      ffffa00007ffffff         128MB          bpf jit region
ffffa00008000000      ffffa0000fffffff         128MB          modules
ffffa00010000000      fffffdffbffeffff         ~93TB          vmalloc
fffffdffbfff0000      fffffdfffe5f8fff        ~998MB          [guard region]
fffffdfffe5f9000      fffffdfffe9fffff        4124KB          fixed mappings
fffffdfffea00000      fffffdfffebfffff           2MB          [guard region]
fffffdfffec00000      fffffdffffbfffff          16MB          PCI I/O space
fffffdffffc00000      fffffdffffdfffff           2MB          [guard region]
fffffdffffe00000      ffffffffffdfffff           2TB          vmemmap
ffffffffffe00000      ffffffffffffffff           2MB          [guard region]

地址空間的定義:

內核中劃分的這么多區域,且都有自己對應的地址與大小,這些地址和大小在kernel中哪里定義著呢?具體位于:arch/arm64/include/asm/memory.h。

#define PAGE_OFFSET             (_PAGE_OFFSET(VA_BITS))
#define KIMAGE_VADDR            (MODULES_END)
#define BPF_JIT_REGION_START    (KASAN_SHADOW_END)
#define BPF_JIT_REGION_SIZE     (SZ_128M)
#define BPF_JIT_REGION_END      (BPF_JIT_REGION_START + BPF_JIT_REGION_SIZE)
#define MODULES_END             (MODULES_VADDR + MODULES_VSIZE)
.....
  • PAGE_OFFSET
    內核線性映射區的起始地址,大小為128TB。
  • KASAN_SHADOW_START
    KASAN影子內存的起始虛擬地址,大小為32TB。為什么是32TB呢?因為KASAN通常使用1:8或1:16比例的內存來做影子內存,分別對應大小為256TB/8=32TB或256TB/16=16TB,這里表示的是1:8的情況所以是32TB。
  • KIMAGE_VADDR
    定義了內核鏡像的鏈接地址,通過其定義"#define KIMAGE_VADDR (MODULES_END)"看出它整好位于modules區域的結尾處,即vmalloc區域的起始地址。vmlinux.ld.S文件設置鏈接地址時會用到它,start_kernel->paging_init->map_kernel會將內核鏡像的各個段依次映射到該區域。
  • VMALLOC_START
    定義了vmalloc區域的起始地址,大小約等于93TB。記得之前ARM32可以通過bootargs去控制vmalloc區域的大小,不知道64還有沒。但是有沒有也沒所謂了,畢竟64位的處理器上虛擬地址空間已不像32位處理器那么緊張。
  • VMEMMAP_START
    定義了vmemmap區域的起始地址,大小2TB。sparsemem內存模型中用來存放所有struct page的虛擬地址空間。

寄存器TTBR0和TTBR1:

本文講到了內核地址空間和用戶地址空間,這就不得不提一下ARM64相關的兩個寄存器TTBR0和TTBR1。它們的功能類似于X86里的CR3寄存器用來存放進程的1級頁表(PGD)的基地址。但不同的是ARM64使用了兩個寄存器分別存放用戶空間和內核空間的1級頁表基地址。

我們知道所有進程的內核地址空間的頁表是共用一套的,所以TTBR1中的內容不會改變,永遠等于init_mm->swapper_pg_dir。但各個進程的用戶空間的頁表各自獨立,那么TTBR0中的內容則等于各自進程的task_struct->mm_struct->pgd

最后提一下,處理器如何知道什么時候訪問TTBR0,什么時候訪問TTBR1呢?ARMv8手冊中有提到,當CPU訪問地址時,若地址的第63bit為1則自動使用TTBR1,為0則使用TTBR0。

備注: 各個版本的虛擬地址分布, 有一點差異,但是大致區域是一致。比如不同的地方:

上面的知乎網友的圖, vmalloc_start 的地址是 0xffffa00000000000; 而我打印的? vmalloc_start 的地址是 0xffff800010000000;

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

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

相關文章

循環神經網絡(RNN):從理論到翻譯

循環神經網絡&#xff08;RNN&#xff09;是一種專為處理序列數據設計的神經網絡&#xff0c;如時間序列、自然語言或語音。與傳統的全連接神經網絡不同&#xff0c;RNN具有"記憶"功能&#xff0c;通過循環傳遞信息&#xff0c;使其特別適合需要考慮上下文或順序的任…

window批處理文件(.bat),用來清理git的master分支

echo off chcp 65001 > nul setlocal enabledelayedexpansionecho 正在檢查Git倉庫... git rev-parse --is-inside-work-tree >nul 2>&1 if %errorlevel% neq 0 (echo 錯誤&#xff1a;當前目錄不是Git倉庫&#xff01;pauseexit /b 1 )echo 警告&#xff1a;這將…

C#中的CLR屬性、依賴屬性與附加屬性

CLR屬性的主要特征 封裝性&#xff1a; 隱藏字段的實現細節 提供對字段的受控訪問 訪問控制&#xff1a; 可單獨設置get/set訪問器的可見性 可創建只讀或只寫屬性 計算屬性&#xff1a; 可以在getter中執行計算邏輯 不需要直接對應一個字段 驗證邏輯&#xff1a; 可以…

【mysql】聯合索引和單列索引的區別

區別核心&#xff1a;聯合索引可加速多個字段組合查詢&#xff0c;單列索引只能加速一個字段。 &#x1f539;聯合索引&#xff08;復合索引&#xff09; INDEX(col1, col2, col3)適用范圍&#xff1a; WHERE col1 ... ? WHERE col1 ... AND col2 ... ? WHERE col1 ..…

如何用 HTML 展示計算機代碼

原文&#xff1a;如何用 HTML 展示計算機代碼 | w3cschool筆記 &#xff08;請勿將文章標記為付費&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 在編程學習和文檔編寫過程中&#xff0c;清晰地展示代碼是一項關鍵技能。HTML 作為網頁開發的基礎語言&#x…

大模型筆記_模型微調

1. 大模型微調的概念 大模型微調&#xff08;Fine-tuning&#xff09;是指在預訓練大語言模型&#xff08;如GPT、BERT、LLaMA等&#xff09;的基礎上&#xff0c;針對特定任務或領域&#xff0c;使用小量的目標領域數據對模型進行進一步訓練&#xff0c;使其更好地適配具體應…

React Native UI 框架與動畫系統:打造專業移動應用界面

React Native UI 框架與動畫系統&#xff1a;打造專業移動應用界面 關鍵要點 UI 框架加速開發&#xff1a;NativeBase、React Native Paper、UI Kitten 和 Tailwind-RN 提供預構建組件&#xff0c;幫助開發者快速創建美觀、一致的界面。動畫提升體驗&#xff1a;React Native…

在QT中使用OpenGL

參考資料&#xff1a; 主頁 - LearnOpenGL CN https://blog.csdn.net/qq_40120946/category_12566573.html 由于OpenGL的大多數實現都是由顯卡廠商編寫的&#xff0c;當產生一個bug時通常可以通過升級顯卡驅動來解決。 OpenGL中的名詞解釋 OpenGL 上下文&#xff08;Conte…

Qt::QueuedConnection詳解

在多線程編程中&#xff0c;線程間的通信是一個關鍵問題。Qt框架提供了強大的信號和槽機制來處理線程通信&#xff0c;其中Qt::QueuedConnection是一種非常有用的連接類型。本文將深入探討Qt::QueuedConnection的原理、使用場景及注意事項。 一、基本概念 Qt::QueuedConnecti…

X86 OpenHarmony5.1.0系統移植與安裝

近期在研究X86鴻蒙,通過一段時間的研究終于成功了,在X86機器上成功啟動了openharmony系統了.下面做個總結和分享 1. 下載源碼 獲取OpenHarmony標準系統源碼 repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v5.1.0-Release --no-repo-ve…

如何診斷服務器硬盤故障?出現硬盤故障如何處理比較好?

當服務器硬盤出現故障時&#xff0c;及時診斷問題并采取正確的處理方法至關重要。硬盤故障可能導致數據丟失和系統不穩定&#xff0c;影響服務器的正常運行。以下是診斷服務器硬盤故障并處理的最佳實踐&#xff1a; 診斷服務器硬盤故障的步驟 1. 監控警報 硬盤監控工具&#…

vue3提供的hook和通常的函數有什么區別

Vue 3 提供的 hook&#xff08;組合式函數&#xff09; 和普通函數在使用場景、功能和設計目的上有明顯區別&#xff0c;它們是 Vue 3 組合式 API 的核心概念。下面從幾個關鍵維度分析它們的差異&#xff1a; 1. 設計目的不同 Hook&#xff08;組合式函數&#xff09; 專為 Vu…

Spark提交流程

bin/spark-submit --class org.apache.spark.examples.SparkPi --master yarn ./examples/jars/spark-examples_2.12-3.3.1.jar 10 這一句命令實際上是 啟動一個Java程序 java org.apache.spark.deploy.SparkSubmit 并將命令行參數解析到這個類的對應屬性上 因為master給…

Microsoft Copilot Studio - 嘗試一下Agent

1.簡單介紹 Microsoft Copilot Studio以前的名字是Power Virtual Agent(簡稱PVA)。Power Virutal Agent是2019年出現的&#xff0c;是低代碼平臺Power Platform的一部分。當時Generative AI還沒有出現&#xff0c;但是基于已有的Conversation AI技術&#xff0c;即Microsoft L…

【源碼剖析】2-搭建kafka源碼環境

在上篇文章kafka核心概念中&#xff0c;解釋了kafka的核心概念&#xff0c;下面開始進行kafka源碼編譯。為什么學習源碼需要進行源碼編譯呢&#xff0c;我認為主要有兩點&#xff1a; 可以進行debug&#xff0c;跟蹤代碼執行邏輯可以對源碼改動&#xff0c;強化學習學習效果 …

小紅書視頻圖文提取:采集+CV的實戰手記

項目說明&#xff1a;這波視頻&#xff0c;值不值得采&#xff1f; 你有沒有遇到過這樣的場景&#xff1f;老板說&#xff1a;“我們得看看最近小紅書上關于‘旅行’的視頻都說了些什么。”團隊做數據分析的&#xff0c;立馬傻眼&#xff1a;官網打不開、接口抓不著、視頻不能…

Cloudflare 從 Nginx 到 Pingora:性能、效率與安全的全面升級

在互聯網的快速發展中&#xff0c;高性能、高效率和高安全性的網絡服務成為了各大互聯網基礎設施提供商的核心追求。Cloudflare 作為全球領先的互聯網安全和基礎設施公司&#xff0c;近期做出了一個重大技術決策&#xff1a;棄用長期使用的 Nginx&#xff0c;轉而采用其內部開發…

從編輯到安全設置: 如何滿足專業文檔PDF處理需求

隨著數字化辦公的發展&#xff0c;PDF 已成為跨平臺文檔交互的標準格式。無論是在日常辦公、學術研究&#xff0c;還是項目協作中&#xff0c;對 PDF 文件進行高效編輯與管理的需求日益增長。功能全面、操作流暢且無額外負擔的 PDF 編輯工具&#xff0c;它是一款在功能上可與 A…

Kafka消費者組位移重設指南

#作者&#xff1a;張桐瑞 文章目錄 一、Kafka 與傳統消息引擎的核心差異二、重設消費者組位移的核心原因三、重設位移的兩大維度與七種策略四、重設位移的實現方式&#xff08;一&#xff09;Java API 方式&#xff08;二&#xff09;命令行腳本方式&#xff08;Kafka 0.11&am…

分類模型:邏輯回歸

1、針對設計&#xff1a;二分類 Logistic 回歸最初是為二分類問題設計的&#xff0c; Logistic 回歸基于概率&#xff0c;通過 Sigmoid 函數轉換輸入特征的線性組合&#xff0c;將任意實數映射到 [0, 1] 區間內。 通過引入一個決策規則&#xff08;通常是概率的閾值&#xff…