【原創】(四)Linux記憶體模型之Sparse Memory Model

来源:https://www.cnblogs.com/LoyenWang/archive/2019/09/15/11523678.html
-Advertisement-
Play Games

背景 By 魯迅 By 高爾基 說明: 1. Kernel版本:4.14 2. ARM64處理器,Contex A53,雙核 3. 使用工具:Source Insight 3.5, Visio 1. 介紹 順著之前的分析,我們來到了 函數了,本以為一篇文章能搞定,大概掃了一遍代碼之後,我默默的把它拆 ...


背景

  • Read the fucking source code! --By 魯迅
  • A picture is worth a thousand words. --By 高爾基

說明:

  1. Kernel版本:4.14
  2. ARM64處理器,Contex-A53,雙核
  3. 使用工具:Source Insight 3.5, Visio

1. 介紹

順著之前的分析,我們來到了bootmem_init()函數了,本以為一篇文章能搞定,大概掃了一遍代碼之後,我默默的把它拆成了兩部分。
bootmem_init()函數代碼如下:

void __init bootmem_init(void)
{
    unsigned long min, max;

    min = PFN_UP(memblock_start_of_DRAM());
    max = PFN_DOWN(memblock_end_of_DRAM());

    early_memtest(min << PAGE_SHIFT, max << PAGE_SHIFT);

    max_pfn = max_low_pfn = max;

    arm64_numa_init();
    /*
     * Sparsemem tries to allocate bootmem in memory_present(), so must be
     * done after the fixed reservations.
     */
    arm64_memory_present();

    sparse_init();
    zone_sizes_init(min, max);

    memblock_dump_all();
}

這一部分,我們將研究一下Sparse Memory Model
在講Linux記憶體模型之前,需要補充兩個知識點:PFNNUMA

1.1 physical frame number(PFN)

前面我們講述過了虛擬地址到物理地址的映射過程,而系統中對記憶體的管理是以頁為單位的:
page:線性地址被分成以固定長度為單位的組,稱為頁,比如典型的4K大小,頁內部連續的線性地址被映射到連續的物理地址中;
page frame:記憶體被分成固定長度的存儲區域,稱為頁框,也叫物理頁。每一個頁框會包含一個頁,頁框的長度和一個頁的長度是一致的,在內核中使用struct page來關聯物理頁。

如下圖,PFN從圖片中就能看出來了:

至於__page_to_pfn這個實現取決於具體的物理記憶體模型,下文將進行介紹。

1.2 NUMA

  • UMA: Uniform Memory Access,所有處理器對記憶體的訪問都是一致的:

從上圖中可以看出,當處理器和Core變多的時候,記憶體帶寬將成為瓶頸問題。

  • NUMA: Non Uniform Memory Access,非一致性記憶體訪問:

從圖中可以看出,每個CPU訪問local memory,速度更快,延遲更小。當然,整體的記憶體構成一個記憶體池,CPU也能訪問remote memory,相對來說速度更慢,延遲更大。目前對NUMA的瞭解僅限於此,在內核中會遇到相關的代碼,大概知道屬於什麼範疇就可以了。

2. Linux記憶體模型

Linux提供了三種記憶體模型(include/asm-generic/memory_model.h):

一般處理器架構支持一種或者多種記憶體模型,這個在編譯階段就已經確定,比如目前在ARM64中,使用的Sparse Memory Model

  • Flat Memory
    物理記憶體地址連續,這個也是Linux最初使用的記憶體模型。當記憶體有空洞的時候也是可以使用這個模型,只是struct page *mem_map數組的大小跟物理地址正相關,記憶體有空洞會造成浪費。

  • Discontiguous Memory
    物理記憶體存在空洞,隨著Sparse Memory的提出,這種記憶體模型也逐漸被棄用了。

  • Sparse Memory
    物理記憶體存在空洞,並且支持記憶體熱插拔,以section為單位進行管理,這也是下文將分析的。

Linux三種記憶體模型下,struct page到物理page frame的映射方式也不一樣,具體可以查看include/asm-generic/memory_model.h文件中的__pfn_to_page/__page_to_pfn定義。

關於記憶體模型,可以參考Memory: the flat, the discontiguous, and the sparse

3. Sparse Memory

本節分析的是ARM64, UMA(linux4.14中不支持ARM NUMA)下的Sparse Memory模型。

3.1 mem_section

Sparse Memory模型中,section是管理記憶體online/offline的最小記憶體單元,在ARM64中,section的大小為1G,而在Linux內核中,通過一個全局的二維數組struct mem_section **mem_section來維護映射關係。
函數的調用過程如下所示,主要在arm64_memory_present中來完成初始化及映射關係的建立:

函數調用結束之後的映射關係如下圖所示:

已知一個pfn時,可以通過__pfn_to_section(pfn)來最終找到對應的struct page結構。

3.2 sparse_init

看看sparse_init函數的調用關係圖:

在該函數中,首先分配了usermap,這個usermap與記憶體的回收機制相關,用4bit的bitmap來描述page block(一個pageblock大小通常為2的次冪,比如MAX_ORDER-1)的遷移類型:

/* Bit indices that affect a whole block of pages */
enum pageblock_bits {
    PB_migrate,
    PB_migrate_end = PB_migrate + 3 - 1,
            /* 3 bits required for migrate types */
    PB_migrate_skip,/* If set the block is skipped by compaction */

    /*
     * Assume the bits will always align on a word. If this assumption
     * changes then get/set pageblock needs updating.
     */
    NR_PAGEBLOCK_BITS
};

sparse memory模型會為每一個section都分配一個usermap,最終的物理頁面的壓縮,遷移等操作,都跟這些位相關,如下圖所示:

sparse_init函數中,另一部分的作用是遍歷所有present section,然後將其映射到vmemmap區域空間。vmemmap區域空間,在之前的文章中也提到過。執行完後,整體的效果如下圖所示:

關於Sparse Memory Model就先分析這麼多,只有結合使用sparse memory的具體模塊時,理解才會更順暢。

一不小心就容易扣細節,而一旦陷入細節,內核就容易變成魔鬼,太難了。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 獲取記憶體使用率 方式1: using System; using System.Runtime.InteropServices; namespace ConsoleApp1 { public class Class1 { static void Main(string[] args) { Conso ...
  • 一、前言 上一篇【分層架構設計】我們已經有了架構的輪廓,現在我們就在這個輪廓裡面造輪子。項目要想開始,肯定先得確定ORM框架,目前市面上的ORM框架有很多,對於.net人員來說很容易就想到以ADO.NET為基礎所發展出來的ORM框架EntityFramework。不得不說EntityFramewor ...
  • // 當時我裝這個也是折騰了一下午 , 所以寫一個筆記記錄一下; //如果哪裡有問題的話我們可以一起討論( qq: 2970911340,郵箱[email protected]),這也是我第一次寫博客 練練手 1. 安cmake工具 # yum install -y cmake 2. 創建mysql用戶 #usera ...
  • 一、Linux系統簡介 通過實驗一瞭解了Linux 的歷史,Linux與windows之間的區別以及學習Linux的方法。因為一直用的都是windows系統,習慣了圖形界面,而Linux是通過輸入命令執行操作,所以初學還很不適應。正如那句話說的windows能做的Linux都能做,windows不能 ...
  • 舊的小米6在抽屜吃灰半年,一直沒想好要怎麼處理,於是就想著安裝Linux。 完整教程來自https://blog.csdn.net/Greepex/article/details/85333027 原文里把每一個步驟都描述得很清楚(所以本文就不貼詳細步驟圖了,豎版截圖太影響觀感),但難免會踩一些坑。 ...
  • 常用的linux命令 ls 查看當前(或者指定)目錄下的文件列表 ls -l 查看詳細信息列表 ls -a 或ls -al 查看目錄下所有文件(包含隱藏文件)的詳細信息 cd ./ 切換到當前目錄 cd ../ 切換到上一級目錄 clear 清屏 (或者ctrl+l) / 根目錄 ~ 家目錄 cd ...
  • 打開dos命令視窗1、win+r-->運行-->cmd 2、摁住shift+滑鼠右擊 選擇 在此處打開命令視窗3、在磁碟某文件夾下,選擇標題欄中輸入框,輸入cmd 回車 windows下常用的命令 系統管理和文件管理systeminfo 獲取系統信息 系統 補丁 網卡path 查看環境變數set 查 ...
  • centOS 7安裝步驟: 1.選擇新建虛擬機,稍後安裝,linux選centos7 64位 2.位置改到存放虛擬機的文件夾 3.把硬碟空間改到40g,記憶體分到4g,1處理器2個核心 4 更改cd/dvd到鏡像位置。 5 選擇中文安裝 6選擇需要的安裝軟體,gui和gnome桌面 7 設置root密 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...