Linux Mem -- 通過reserved-memory縮減內存

目錄

1. reserved-memory縮減內存

2. 為什么要通過2段512GB預留內存實現該縮減呢?

3. reserved-momery中的no-map屬性

4. 預留的的內存是否會被統計到系統MemTotal中?


?

本文是解決具體的一些思考總結,和Linux內核的reserved-memory機制相關。

參考代碼:Linux-6.10

1. reserved-memory縮減內存

??????? 實際開發過程有需求驗小內存產品時系統性能情況,為節省成本直接將大內存產品的內存進行軟件縮減成小內然后進行性能驗證。

??????? 例如有8GB內存產品需要縮減為7GB內存,通過Linux內核的reserved-memory機制實現該縮減需求,具體修改如下。通過預留2段512GB內存的reserved-memory內存,來達到縮減1GB內存的目的。對于此預留機制實現的縮減方案會有一些疑問,隨后就相關疑問進行調查解答。

reserved-memory {#address-cells = <2>;#size-cells = <2>;ranges;removed-memory1:removed_memory_region1 {alloc-renges=<0x0 0x00000000 0xffffffff 0xffffffff>;size= <0x0 0x20000000>; //512MBytesno-map;};removed-memory2:removed_memory_region2 {alloc-renges=<0x0 0x00000000 0xffffffff 0xffffffff>;size= <0x0 0x20000000>; //512MBytesno-map;};}

2. 為什么要通過2段512GB預留內存實現該縮減呢?

??????? 答案是可以是1段1GB或者多個段合成1GB遺留內存,但是要確保每段的預留內存可以預留成功。

??????? reserved-momory是遍歷memblock.memory域中的可以內存,從可用內存空間中劃分一段符合預留內存要求的內存空間放到memblock.reserved區域,又因為memblock.memory域中的內存已經被劃分為多個段,如果要預留1GB空間的內存時任意一段內存空間可能小于1GB,則需要將預留的內存空間劃分為多個小端內存就行預留。如上將1GB的預留內存空間劃分為2個512MB,就是為了確保預留內存的成功預留。所以預留內存時,無論劃分成了幾段預留要需要保證每一段度都預留成功,為了保證預留成功盡可能的將大內存劃分為多個小段內存進行預留。

??????? 具體邏輯可以解析__reserved_mem_alloc_in_range()函數。

3. reserved-momery中的no-map屬性

????????預留的內存如果不想被系統使用,則需要添加no-map屬性。該屬性保證預留的內存不會在系統內存映射時被映射到虛擬空間。對應代碼邏輯:

文件路徑:arch/arm64/mm/mmu.cstatic void __init map_mem(pgd_t *pgdp)
{……//遍歷memblock.memory內存region,對符合要求的內存region進行映射for_each_mem_range(i, &start, &end) {if (start >= end)break;//對符合要求的memblock.memory內存進行映射__map_memblock(pgdp, start, end, pgprot_tagged(PAGE_KERNEL), flags);}……
}

????????for_each_mem_range定義如下,該宏目的在于變量memblock.memory中的所有內存域,遍歷時會調用到should_skip_region()函數,該函數會跳過具有MEMBLOCK_NOMAP標識的內存塊,故具有MEMBLOCK_NOMAP標識的內存塊不會被進行內存映射

#define for_each_mem_range(i, p_start, p_end) \
__for_each_mem_range(i, &memblock.memory, NULL, NUMA_NO_NODE,        \MEMBLOCK_HOTPLUG | MEMBLOCK_DRIVER_MANAGED, \p_start, p_end, NULL)

4. 預留的的內存是否會被統計到系統MemTotal中?

? ? ? ? 答案是否定的,具有no-map屬性reserved-memory預留內存是不是被統計到mem total中。 ??????? /poc/meminfo中的MemTotal值來自系統變量_totalram_pages,則從_totalram_pages賦值邏輯可以確認預留內存是否被統計到MemTotal。系統在進行__totalram_pages統計時,因為調用到should_skip_region()函數,具有no-map屬性的page會被排除統計。所以給方式預留的內存不會被統計到系統的memtotal中。

????????如下函數是給_totalram_pages賦值的部分邏輯:

void __init memblock_free_all(void)
{unsigned long pages;free_unused_memmap();reset_all_zones_managed_pages();//統計系統free狀態的page數量pages = free_low_memory_core_early();//將free的page數量添加給_totalram_pagestotalram_pages_add(pages);
}
static unsigned long __init free_low_memory_core_early(void){unsigned long count = 0;phys_addr_t start, end;u64 i;memblock_clear_hotplug(0, -1);memmap_init_reserved_pages();//遍歷memblock.memory 和 memblock.reserved兩個域內存,遍歷時會調用should_skip_region()函//數跳過具有MEMBLOCK_NOMAP屬性的內存區域,故具有MEMBLOCK_NOMAP標識的內存區域//不會被統計到。所以 memblock.momory中具有MEMBLOCK_NOMAP標識的內存區域不會被//統計到MemTotal中。另因為有遍歷memblock.reserved內存區域,故memblock.reserved中//不符合should_skip_region()函數的要求內存區域也可能被統計到MemTotal中for_each_free_mem_range(i, NUMA_NO_NODE, MEMBLOCK_NONE, &start, &end, NULL)count += __free_memory_core(start, end);return count;
}

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

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

相關文章

多線程—synchronized原理

上篇文章&#xff1a; 多線程—鎖策略https://blog.csdn.net/sniper_fandc/article/details/146508232?fromshareblogdetail&sharetypeblogdetail&sharerId146508232&sharereferPC&sharesourcesniper_fandc&sharefromfrom_link 目錄 1 synchronized的鎖…

AWS混合云部署實戰:打造企業級數字化轉型的“黃金架構”

引言 “上云是必然&#xff0c;但全部上云未必是必然。”在數字化轉型的深水區&#xff0c;企業面臨的核心矛盾日益凸顯&#xff1a;如何在享受公有云敏捷性的同時&#xff0c;滿足數據主權、低延遲和遺留系統兼容的剛性需求&#xff1f; AWS混合云憑借“云上云下一張網”的獨…

進程模型5-0號進程

內核版本架構作者GitHubCSDNLinux-3.0.1armv7-ALux1206 0號進程的作用 在 Linux 中除了 init_task 0號進程&#xff0c;所有的線/進程都是通過 do_fork 函數復制父線/進程創建得到&#xff0c;因為 0號進程產生時沒有任何進程可以參照&#xff0c;只能通過靜態方式構造進程描述…

計算機二級考前急救(Word篇)

重點題&#xff08;20套&#xff0c;標黃為精選10套&#xff09;&#xff1a;4&#xff0c;15&#xff0c;17&#xff0c;19&#xff0c;21&#xff0c;24&#xff0c;25&#xff0c;27&#xff0c;36&#xff0c;40&#xff0c;12&#xff0c;18&#xff0c;20&#xff0c;22&…

constant(safe-area-inset-bottom)和env(safe-area-inset-bottom)在uniapp中的使用方法解析

在微信小程序中&#xff0c;padding-bottom: constant(safe-area-inset-bottom); 和 padding-bottom: env(safe-area-inset-bottom); 這兩個 CSS 屬性用于處理 iPhone X 及更高版本設備的安全區域&#xff08;safe area&#xff09;。這些設備的底部有一個“Home Indicator”&a…

十二、Cluster集群

目錄 一、集群簡介1、現狀問題2、集群作用 二、集群結構設計1、集群存儲設2、消息通信設計 三、Cluster集群三主三從結構搭建1、redis.conf配置文件可配置項2、配置集群3、鏈接集群4、命令客戶端連接集群并使用 四、集群擴容1、添加節點2、槽位分配3、添加從節點 五、集群縮容1…

Java基礎 3.29

1.數組的相關注意事項 錯誤示范一 String strs[] new String[2]{"a", "b"}; 正確示范一 String strs[] new String[]{"a", "b"}; 讓JVM自己判斷有幾個數據&#xff0c;無需再其中寫明有幾組數據 錯誤示范二 String strs[] new…

從入門到精通:HTML 項目實戰中的學習進度(一)

一、基礎夯實階段 1.1 HTML 文檔結構與核心語法 在 HTML5 的世界里&#xff0c;構建一個文檔就像是搭建一座大廈&#xff0c;堅實的基礎至關重要。HTML5 文檔的基礎框架以<!DOCTYPE html>聲明開場&#xff0c;這就好比是給瀏覽器下達的一份 “指令書”&#xff0c;明確…

FFmpeg —— 實時繪制音頻波形圖(附源碼)

?? FFmpeg 相關音視頻技術、疑難雜癥文章合集(掌握后可自封大俠 ?_?)(記得收藏,持續更新中…) 實時繪制音頻波形圖 步驟 ????? ??????????FFmpeg打開媒體文件,讀取每一包數據,將音頻數據包進行緩沖,一包一包處理音頻緩沖,對音頻緩沖包進行解碼,讀…

大數據學習(88)-zookeeper實現的高可用(HA)

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

基于MFC按鈕邏輯

void CSUCCES1Dlg::SetDlgItemState()//IDC_BTN_INIT初始化按鈕 { GigeState state = GigeState::ARV_NONE;//GigeState是一個枚舉類型,stat狀態為ARV_NONE int idx = ((CListBox*)GetDlgItem(IDC_LIST_GIGE))->GetCurSel();//GetDlgItem 是 MFC 框架提供的一個成員…

EF Core 樂觀并發控制(并發令牌)

文章目錄 前言一、樂觀并發的核心思想二、實現方法1&#xff09;使用并發令牌&#xff08;Concurrency Token&#xff09;2&#xff09;處理并發沖突 三、工作原理四、適用場景五、與悲觀并發的對比六、最佳實踐總結 前言 Entity Framework (EF) Core 默認支持 樂觀并發控制&a…

解決 FFmpeg 使用 C/C++ 接口時,解碼沒有 shell 快的問題(使用多線程)

一、問題 硬件設備為香橙派 5Plus&#xff0c;最近需要使用硬件視頻解碼來加速 YOLO 的檢測&#xff0c;shell 窗口的FFmpeg已經調通&#xff0c;詳見文章&#xff1a; 編譯支持 RKmpp 和 RGA 的 ffmpeg 源碼_rk3588 ffmpeg mpp-CSDN博客https://blog.csdn.net/plmm__/article…

工業控制網絡中常用的通信協議

1. 現場總線協議 Modbus 概述&#xff1a;Modbus 是最廣泛使用的工業協議之一&#xff0c;主要用于串行通信&#xff0c;支持主/從架構&#xff0c;通過 RS-232 或 RS-485 傳輸&#xff0c;也有基于以太網的 Modbus TCP 版本。特點&#xff1a;簡單易用&#xff0c;易于實現&am…

【Mac】npm error Error: EACCES: permission denied, mkdir‘/Users/...

問題描述&#xff1a;Mac電腦中的 vscode 下載依賴的時候提示沒有權限&#xff1a; 故障分析 首先賬號是有權限的&#xff0c;電腦就建了一個賬號是管理員&#xff1b;在桌面用shell直接執行命令npm init 命令可以執行成功&#xff0c;那么問題就出在vscodes上面了&#xff0…

Ruby 簡介

Ruby 簡介 引言 Ruby 是一種廣泛使用的動態、開源的編程語言,自 1995 年由日本程序員 Yukihiro Matsumoto(通稱 Matz)設計以來,它以其優雅的語法、強大的庫支持和跨平臺特性贏得了全球開發者的青睞。本文將詳細介紹 Ruby 的起源、特點、應用領域以及它在現代軟件開發中的…

[Qt5] QMetaObject::invokeMethod使用

&#x1f4e2;博客主頁&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01;&#x1f4e2;本文由 丶布布原創&#xff0c;首發于 CSDN&#xff0c;轉載注明出處&#x1f649;&#x1f4e2;現…

Windows10清理機器大全集

Windows10清理機器大全集 寫在前面先這么個標題&#xff0c;逐漸補充禁止Update移除Microsoft Compatibility Telemetrywindows-defender-remover其它 寫在前面 看到標題&#xff0c;讀者已經就吐了。 我是說&#xff0c;我非常認可: IT從業者&#xff0c;如果你銀子比較充足&…

【AI】NLP

不定期更新&#xff0c;建議關注收藏點贊。 目錄 transformer大語言模型Google Gemma疫情網民情緒識別 整體框架 baseline構建 模型調參、模型優化、其他模型 數據trick、指標優化、magic feature 數據增強、偽標簽、遷移學習 模型融合sklearn中TFIDF參數詳解 頻率閾值可以去掉…

如何為 Debian 和 Kali 系統更換軟件源并更新系統

在 Linux 系統中&#xff0c;軟件源&#xff08;Software Repository&#xff09;是獲取軟件包和更新的核心途徑。然而&#xff0c;默認的軟件源可能會因為地理位置、網絡狀況等原因導致下載速度緩慢&#xff0c;甚至無法訪問。為了提升系統的軟件獲取效率&#xff0c;許多用戶…