Linux內存管理

一、內存基礎

1、內存的種類 – SRAM,DRAM,SDRAM,DDR SDRAM

Static RAM(靜態隨機存取內存)是保持數據存儲的最簡單的形式。Dynamic RAM(動態隨機存取內存)是一種需要定時重置的內存,之所以需要這樣做是因為電荷會從RAM細胞中“泄漏”出去。寫操作可恢複電荷,刷新操作則需要一個定時器和一些電容來存儲電荷。 SDRAM (synchronous dynamic RAM)是DRAM的進化版本,具有更高的帶寬和更低的延遲。DDR SDRAM (double data rate SDRAM) 使用更複雜的信號路線,在一個時鐘周期內傳輸更多的數據。

2、內存物理分區 – 根據內存大小自動分為幾個物理分區

3、內存虛擬分區 – 操作系統通過將主存分成小塊來提供更高的內存管理

二、內存管理

1、進程和虛擬地址

/**
 * 用於訪問主物理內存的頁表在頁表所在的頁中進行到原始形式和物理形式之間轉換的邏輯地址計算工具
 */
#define virt_to_phys(virt)                 (__pa(virt))

/**
 * 通過計算出查找真正的物理地址的單元的索引,從而找到虛擬地址對應的物理地址
 * @param[in] dir 目錄指針
 * @param[in] address 虛擬地址
 * @return 對應的物理地址指針
 */
#define PTE_ADDR(hi, lo)                    ((pte_t *)((w32)PTE_BASE + (((hi) << PAGE_DIR_SHIFT) | ((lo) <> 2))
#define pte_offset_virt_to_phys(pdir, address) \
    (*(pte_t **)(&pdir[PTE_INDEX(address)]) + ((address & (PAGE_SIZE - 1)) >> 2))

2、物理內存和虛擬內存

3、內存中斷和鎖定 – 內核不適用於虛擬內存分頁,但可以鎖定數據以保持coherency

三、內存分配和釋放

1、一般內存池、緩衝區鏈表和內存碎片

2、內核內存配置和釋放 – 調用kmalloc和kfree

/**
 * 分配內核中的內存
 * flags:GFP_KERNEL/fatal_signals_pending
 */
#define kmalloc_(size, flags, align)                                             \
({  void *__kmalloc_result;                                                       \
    BugOn(in_interrupt());                                                        \
    __kmalloc_result = mem_kmalloc(size, flags, align);                            \
    if (unlikely(!__kmalloc_result)) {                                             \
        show_low_mem();                                                             \
        panic("KMALLOC FAILED size %d\n", (int)(size));                              \
    }                                                                               \
    __kmalloc_result;                                                               \
})

/**
 * 釋放內核內存
 */
#define kfree_(addr) mem_kfree(addr)

3、內存碎片整理技術 – 使用壓縮和緊縮分區管理策略來減少內存碎片

四、內存映射

1、內存管理單元

/**
 * @file memory.h
 * @brief 內存管理單元
 */

#include "pt.h"

struct mm_struct_tag;

/**
 * 頁表
 */
typedef struct page_map_contents_tag {
        /**
         * 在上下文中啟用頁表,該上下文由paging_init()調用生成。所有我們真正關心的頁幀都是在初始化上下文時創建的
         */
        pt_t *pt_root;
        int user_pdir_idx;
        /**
         * 首先,我們為一個進程保留單獨的頁表
         * mm是一個進程上下文的表示
         */
        struct mm_struct_tag *owner;
} pmc_t;

/**
 * 物理頁
 */
typedef struct pmem_contents_tag {
        /**
         * 指向內存中該物理頁在內存中的位置的指針
         */
        u32 *virt;
        /**
         * 引用計數,表示有多少用戶或內核空間塊正在使用該頁
         */
        u32 usage_count;
} ppc_t;

/**
 * 內存管理單元
 */
typedef struct memory_map_contents_tag {
        /**
         * 整個機器的總物理內存(KBs),在啟動時靜態分配
         */
        u32 phys_mem_bytes;
        /**
         * 物理頁數
         */
        u32 num_phys_pages;
        /**
         * 所有物理頁的數組,每個pg和PgMap存儲指向其他pmem_contents_struct和page_map_contents_struct結構的指針,用於向新的內存映射添加額外的頁
         */
        ppc_t *ppc;
        pmc_t *pmc;
        /**
         * 當前的物理頁數,以enable_paging()被調用時初始化為num_phys_pages,然後在每次分配新物理頁時減少
         */
        u32 available_phys_pages;
} mmc_t;

2、分頁和段式內存管理

3、用戶態和內核態的內存訪問權限 – 運行用戶程序時,訪問虛擬地址

五、內存監測和優化

1、監視內存使用情況 – 使用各種工具和技術來掌握內存使用情況,如top,free和vmstat等

2、內存優化 – 避免內存泄漏、碎片以及使用內存和緩存的過度

3、第三方工具 – 針對內存監測和優化的各種第三方工具

原創文章,作者:QKGSA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/373012.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QKGSA的頭像QKGSA
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相關推薦

  • 如何在Linux中添加用戶並修改配置文件

    本文將從多個方面詳細介紹在Linux系統下如何添加新用戶並修改配置文件 一、添加新用戶 在Linux系統下創建新用戶非常簡單,只需使用adduser命令即可。使用以下命令添加新用戶…

    編程 2025-04-27
  • 如何解決linux jar包 invalid or corrupt jarfile問題

    對於許多開發人員和系統管理員在Linux環境下使用Java開發過程中遇到的一個常見的問題是 invalid or corrupt jarfile(無效或損壞的jar文件)錯誤。當您…

    編程 2025-04-27
  • 在Linux上安裝JRE並配置環境變量

    本文將從以下幾個方面為您詳細闡述如何在Linux系統上,通過自己賬戶安裝JRE,並且配置環境變量。 一、安裝JRE 在進行安裝前,我們需要下載JRE的安裝包並解壓,可以從官方網站下…

    編程 2025-04-27
  • GTKAM:Linux下的照片管理器

    GTKAM是用於Linux操作系統的一款照片管理器,它支持多種相機及存儲設備,並提供了一系列強大的工具,讓用戶可以方便地瀏覽、管理、編輯和導出照片。本文將從多個方面對GTKAM進行…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • 如何在Windows/Linux/MacOS下安裝Python

    如果你對Python安裝一無所知,本文將從多個方面對Python在Windows/Linux/MacOS下的安裝做出詳細闡述,為初學者提供幫助。 一、Windows下Python的…

    編程 2025-04-25
  • Linux網絡連接激活失敗原因及解決方法

    一、網卡驅動問題 1、缺少網卡驅動 若使用新的網卡,需要安裝對應網卡驅動,否則會導致網絡連接激活失敗。可通過以下命令查看當前系統中是否存在網卡驅動: lsmod | grep et…

    編程 2025-04-25
  • Linux Redis 重啟

    一、概述 Redis 是一款高性能的 NoSQL 數據庫,常用於各種應用場景的數據緩存、消息隊列、實時數據分析等等。在使用 Redis 過程中,如果出現了某些問題,有時候只需要重啟…

    編程 2025-04-25
  • Linux防火牆配置詳解

    一、iptables基本介紹 iptables是一個重要的Linux內核中網絡安全系統,通過設置iptables規則,可以對進入和離開Linux服務器的數據進行過濾。 iptabl…

    編程 2025-04-25

發表回復

登錄後才能評論