一、內存基礎
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