自用學習資料,Linux核心之[記憶體管理]的一些分享

柒柒愛程式設計發表於2021-12-23

本文涉及的資料全部打包放到我Github倉:
GitHub - https://github.com/0voice/kernel_memory_management
有需要的可以前去下載,或者覺得還不錯,請給我Star,感謝支援!

img

? 100篇文章

記憶體管理(一):硬體原理 和 分頁管理

記憶體管理(二):記憶體的動態申請和釋放

記憶體管理(三):程式的記憶體消耗和洩漏

記憶體管理(四):記憶體與IO的交換

記憶體管理(五):其他工程問題以及調優

———記憶體管理系列文章———

記憶體管理系列一:啟動簡介

記憶體管理系列二:建立啟動階段的頁表

記憶體管理系列三:MMU前CPU初始化及開啟MMU

記憶體管理系列四:setup_arch簡介(記憶體管理初始化)

記憶體管理系列五:alloc_pages從夥伴系統申請空間簡易流程

記憶體管理系列六:夥伴系統之buffered_rmqueue

記憶體管理系列七:slub初始化

記憶體管理系列八:slub建立

記憶體管理系列九:slub申請記憶體

記憶體管理系列十:slub回收

記憶體管理系列十一:slub銷燬

記憶體管理系列十二:vmalloc記憶體機制

記憶體管理系列十三:VMA操作

記憶體管理系列十四:brk

記憶體管理系列十五:do_page_fault缺頁中斷

記憶體管理系列十六:反向對映RMAP

記憶體管理系列十七:記憶體池

記憶體管理系列十八:記憶體回收之LRU連結串列

記憶體管理系列十九:記憶體壓縮演算法

記憶體管理系列二十:記憶體壓縮演算法之資料同步

記憶體管理系列二十一:記憶體回收入口

記憶體管理系列二十二:記憶體回收核心流程

———-英文文章鑑賞———-

Linux: large-memory management histories

Looking at kmalloc() and the SLUB Memory Allocator

Memory Management in OS: Contiguous, Swapping, Fragmentation

Memory Management in Operating System

Operating System - Memory Management

Virtual Memory in OS: What is, Demand Paging, Advantages

———-分割線———-

Linux 核心(5.4.81)—記憶體管理模組原始碼分析

glibc2.23 ptmalloc 原理概述

多核心Linux核心路徑最佳化的不二法門之-slab與夥伴系統

盡情閱讀,技術進階,詳解mmap原理

淺談Linux記憶體管理機制

Linux中的記憶體管理機制

C++中記憶體管理之new、delete

malloc和free的實現原理解析

常用暫存器總結

記憶體碎片之外部碎片與內部碎片

Linux虛擬記憶體管理,MMU機制,原來如此

一文了解,Linux記憶體管理,malloc、free 實現原理

記憶體管理之記憶體對映

記憶體管理之分頁

記憶體管理之核心空間和使用者空間

Linux 記憶體佔用分析的幾個方法,你知道幾個?

深入理解 Linux 記憶體子系統

深入理解 glibc malloc:記憶體分配器實現原理

圖解 Linux 記憶體效能最佳化核心思想

img

? 影片

Linux核心原始碼/記憶體調優/檔案系統/程式管理/裝置驅動/網路協議棧

記憶體管理 —Slab | 記憶體對映 | kmalloc | vmalloc | 核心原始碼 | MM | brk

90分鐘瞭解 Linux記憶體架構— numa的優勢 | slab的實現 | vmalloc的原理

記憶體分配與回收機制—夥伴演算法|slab分析|記憶體對映|程式虛擬空間|請求調頁|寫時複製

3種記憶體洩漏的解決方案–hook|malloc函式|free函式|避免記憶體洩漏

剖析Linux核心MMU機制—頁表原理|快取記憶體|TLB工作原理|記憶體對映|不連續頁原理

虛擬記憶體空間之VMA實戰操作

Linux核心記憶體管理(一)—記憶體對映|空間管理|ARM32/64頁表|slab分配器|malloc

Linux核心記憶體管理(二)—malloc|mmap|反向對映|缺頁中斷處理|回收頁面|KSM實現|記憶體漏洞|匿名頁面

Linux核心記憶體管理(三)—Slab機制架構|物理頁面|管理區|分配/釋放頁面

Linux核心之記憶體頁回收—LRU及反向對映?如何非同步回收、直接回收?以及回收slab快取

Linux核心記憶體管理專題訓練營(一)—夥伴系統|slab分配器|vmalloc()|malloc()|TLB|虛擬記憶體|缺頁機制

Linux核心記憶體管理專題訓練營(二)—夥伴系統|slab分配器|vmalloc()|malloc()|TLB|虛擬記憶體|缺頁機制

Linux核心精講之記憶體管理—實體記憶體組織|核心引導|記憶體對映

Linux實體記憶體頁面分配—kmalloc|slab/slub|頁框分配機制

img

❓ 面試題

59問:記憶體管理

  • 如何知道計算機記憶體佈局?記憶體空間有多少?

  • 何時去探明記憶體佈局?由誰去探明呢?

  • kernel會載入到何處呢?由什麼決定它的位置?

  • kernel映像如何隱匿自己的位置?

  • 探知的e820表如何處理?

  • 記憶體是連續的嗎?

  • 處理完畢的e820表如何管理?

  • 啟動之時記憶體如何對映的?

  • 保護模式是怎樣的?相比真實模式有何特點?

  • 頁保護模式是怎樣的?

  • 頁面對映有何作用?都有什麼好處?

  • x86支援的對映模式都有哪些形式?如何分級的?

  • 核心如何處理多樣式的頁對映?

  • 面對NUMA等複雜記憶體環境如何處理?

  • 核心頁表如何建立?

  • 核心態程式虛擬地址與實體記憶體的對映關係?

  • 使用者態程式虛擬記憶體與實體記憶體的關係如何?

  • 記憶體管理框架如何構造?

  • Kernel記憶體空間如何劃分?

  • 64位地址空間如何劃分?

  • 記憶體分配空間如何實現不可預測性?

  • 實體記憶體是如何管理的?怎麼分配的?

  • Buddy管理演算法所處的位置?在什麼地方體現?

  • 記憶體碎片化了怎麼辦?

  • 如何為驅動應用預留大塊連續記憶體?

  • LRU如何運作?

  • 記憶體回收是如何運作的?

  • 相同的記憶體浪費記憶體空間了?

  • 頁面空間監測手段有什麼?

  • 如何降低頁面分配的可預測性?

  • 如何防範記憶體洩密?

  • 如何檢視Buddy管理演算法下的記憶體型別資訊?

  • 小塊記憶體空間如何分配管理?

  • SLUB如何管理記憶體的?

  • 如何檢視slab資訊?

  • 如何防範slab空閒連結串列的攻擊?

  • SLUB分配如何防止被預判?

  • kmalloc和kfree如何實現的?

  • kernel的記憶體洩漏如何定位?

  • kernel有記憶體檢測機制嗎?

  • 支離破碎的記憶體如何得到大塊連續記憶體?

  • 如何檢視vmalloc資訊?

  • Percpu記憶體空間如何管理的?

  • 從proc介面還可以看到什麼?

  • 容器的記憶體如何管理?

  • 核心如何防範資訊外洩?

  • 實體記憶體頁面耗盡瞭如何處理?

  • 核心程式碼段如何進行自我防護?

  • 核心程式碼段如何防護注入?

  • kernel程式空間能否再壓榨?

  • 面向使用者態程式,核心提供了哪些記憶體分配介面?

  • brk介面實現了什麼?

  • mmap介面實現了什麼?

  • 使用者態記憶體如何管理?

  • glibc對brk和mmap如何使用?

  • 如何檢視程式記憶體對映資訊?

  • 如何檢視程式記憶體佔用實際情況?

  • 如何檢視程式記憶體片段對映詳情?

  • 如何檢視程式記憶體對映彙總資訊?

img

? 100篇論文

《ARM的虛擬記憶體管理技術的研究》

《C語言的記憶體漏洞分析與研究》

《FreeRTOS記憶體管理方案的分析與改進》

《Linux Memory Management》

《Linux記憶體管理分析與研究》

《Linux記憶體管理的設計與實現》

《Linux核心中記憶體池的實現及應用》

《Linux核心中動態記憶體檢測機制的研究》

《Linux核心夥伴系統分析》

《Linux核心記憶體池實現研究》

《Linux實時記憶體的研究與實現》

《Linux作業系統核心分析與研究》

《Memory Management 101: Introduction to Memory Management in Linux》

《Memory Management in Linux》

《Memory Management》

《NUMA架構內多個節點間訪存延時平衡的記憶體分配策略》

《Nginx Slab演算法研究》

《TCP_IP協議棧的輕量級多執行緒實現》

《VC中利用記憶體對映檔案實現程式間通訊的方法》

《Virtual Memory Management Techniques in 2.6 Kernel and Challenges》

《Visual C 中利用記憶體對映檔案在程式之間共享資料》

《Linux Physical Memory Page Allocation》

《一個記憶體分配器的設計和實現》

《一種Linux記憶體管理機制》

《一種TLB結構最佳化方法》

《一種最佳化的夥伴系統儲存管理演算法設計》

《一種基於虛擬機器的動態記憶體洩露檢測方法》

《一種提高Linux記憶體管理實時性的設計方案》

《一種改進的Linux記憶體分配機制》

《一種改進的夥伴系統記憶體管理方法》

《一種跨平臺記憶體池的設計與實現》

《一種高效的池式記憶體管理器的設計》

《雲端計算平臺中多虛擬機器記憶體協同最佳化策略研》

《雲端計算平臺中多虛擬機器記憶體協同最佳化策略研究》

《記憶體管理機制的高效實現研究》

《分頁儲存管理系統中記憶體有效訪問時間的計算》

《利用記憶體對映連續性提高TLB地址覆蓋範圍的技術評測》

《動態記憶體分配器研究綜述》

《動態儲存管理機制的改進及實現》

《基於C 的高效記憶體池的設計與實現》

《基於C 自定義記憶體分配器的實現》

《基於Linux核心的動態記憶體管理機制的實現》

《基於Linux核心頁表構建核心隔離空間的研究及實現》

《基於RDMA和NVM的大資料系統一致性協議研究》

《基於RDMA高速網路的高效能分散式系統》

《基於RelayFS的核心態記憶體洩露的檢測和跟蹤》

《基於linux使用者態可自控緩衝區管理設計與實現》

《基於multimap對映的動態記憶體分配演算法探究》

《基於雲端計算虛擬化平臺的記憶體管理研究》

《基於記憶體池的空間資料排程演算法》

《多核系統記憶體管理演算法的研究》

《實時系統記憶體管理方案的設計與實現》

《對linux夥伴系統及其反碎片機制的研究》

《嵌入式實時系統動態記憶體分配管理器的設計與實現》

《併發資料結構及其在動態記憶體管理中的應用》

《應用協同的程式組記憶體管理支撐技術》

《支援高效能IPC的記憶體管理策略研究》

《有效的C 記憶體洩露檢測方法》

《淺析夥伴系統的分配與回收》

《使用者態記憶體管理關鍵技術研究》

《申威處理器頁表結構Cache的最佳化研究與實現》

《虛擬化系統中的記憶體管理最佳化》

《面向Linux核心空間的記憶體分配隔離方法的研究與實現》

《頁面分配器的研究與實現》

img

? 記憶體池相關

文章

  • 18張圖揭秘高效能Linux伺服器記憶體池技術是如何實現的

  • C++ 實現高效能記憶體池

  • Nginx 記憶體池管理

  • 效能最佳化:高效記憶體池的設計與實現

框架

? 記憶體洩露

  • 5 useful tools to detect memory leaks with examples

  • 記憶體洩漏的線上排查

? 記憶體管理工具

Valgrind:Valgrind是一個用於構建動態分析工具的工具框架。有一些Valgrind工具可以自動檢測許多記憶體管理和執行緒錯誤,並詳細分析你的程式。您還可以使用Valgrind來構建新的工具。 Valgrind發行版目前包括7個產品質量的工具:一個記憶體錯誤檢測器、兩個執行緒錯誤檢測器、一個快取和分支預測分析器、一個呼叫圖生成快取和分支預測分析器,以及兩個不同的堆分析器。它還包括一個實驗性的SimPoint基本塊向量生成器。

AddressSanitizer:Google出品的記憶體檢測工具

記憶體效能指標

img

指標-工具對映圖

img

工具-指標對映圖

img

分析思路

a. 先用 free 和 top,檢視系統整體的記憶體使用情況。

b. 用vmstat及pidstat檢視記憶體變化情況,確定記憶體問題型別

c. 詳細分析,如記憶體分配分析、快取/緩衝區分析、具體程式的記憶體分析

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章