linux kernel記憶體管理資料結構

2021-07-26 09:37:35 字數 2113 閱讀 1949

是乙個全域性變數, 指向乙個struct page陣列, 管理著系統中的所有物理頁面, 陣列中的每個page結構,對應乙個物理頁框.

mem_map僅當系統為單node時有效, 對於arm平台, 只有乙個node

/*

* with no discontig, the global mem_map is just set as node 0's

*/if (pgdat == node_data(0))

}

從上面**的注釋我們可以得到如下資訊:

1. zone是不需要按照max_order對齊的

2. 但是memmap分配時, 必須按照max_order對齊, 目的是buddy 分配能夠正常工作

3. mem_map是由memblock分配的,因此起始位置是動態分配的, 大小計算: 對齊區域頁面數*36bytes, (36bytes為page結構大小)

meminfo儲存系統啟動階段的記憶體配置, 會被啟動時的初始化函式使用.

struct meminfo ;

/* * this keeps memory configuration data used by a couple memory

* initialization functions, as well as show_mem() for the skipping

* of holes in the memory map.  it is populated by arm_add_memory().

*/struct meminfo meminfo;

uboot需要傳入記憶體bank配置引數, 系統在初始化階段根據這些引數填充meminfo, 有兩種途徑傳入系統記憶體配置

這裡僅描述device tree方式傳入記憶體layout

early_init_dt_scan_memory會解析device_tree中的memory節點,

->early_init_dt_add_memory_arch

->arm_add_memory(base, size); 填充乙個bank, base和size會頁對齊, 對於超出4g範圍的部分會被截掉

meminfo通過device tree填充後, 並不是一成不變的, 系統會對重新調整meminfo中的bank

sanity_check_meminfo函式遍歷每乙個bank, 如果發現某個bank跨過了vmalloc_limit, 那麼就要把這個bank分成連個bank

memblock是在kernel 2.6.35引入的, 目的是為了替代bootmem, 簡化啟動階段記憶體管理**. memblock**並不是重新開發的, 而是使用已經存在的logical memory block(lmb). lmb早已在microblaze, powerpc, superh和sparc架構上使用.

struct memblock_region ;

struct memblock_type ;

struct memblock ;

extern struct memblock memblock;

memblock包含兩個記憶體區佇列: memory和reserved

memory表示memblock管理的記憶體區, 而reserved表示memblock預留的記憶體區(包括通過memblock分配的, 以及通過memblock_reserve介面預留的), 在reserved中描述的位址範圍不可以再被用來分配.

struct zone

reset_all_zones_managed_pages會對所有zone的managed_pages清0

free_low_memory_core_early則會重新計算各個zone的managed_pages(只計算低端記憶體)

static unsigned long __init free_low_memory_core_early(void)

return count;

}

計算memblock中描述的所有空閒記憶體區, 空閒記憶體區的計算方式是從memory region扣去reserved region.

Linux kernel 記憶體子系統

理論概述 核心把物理頁作為記憶體管理的基本單位 使用struct page結構來描述當前機器上的每乙個物理頁 比如核心支援4kb的頁大小,機器上有1gb物理記憶體,那麼意味著會有262144個struct page 核心把物理頁劃分為不同的區 同一區內的記憶體具有相似的特徵 一般會有zone dma...

Linux kernel 記憶體損壞漏洞

漏洞名稱 linux kernel 記憶體損壞漏洞 cnnvd編號 cnnvd 201310 143 2013 10 11 2013 10 11 危害等級 中危漏洞型別 緩衝區溢位 威脅型別 遠端 本地 cve編號 cve 2013 4387 linux kernel是美國linux 會發布的一款作...

Linux Kernel 記憶體分配方式

頁分配unsigned long get free pages gfp t gfp mask,unsigned int order 直接從buddy系統中獲得原始頁。最原始的分配方式。slab分配器1.通用 cache void kmalloc size t size gfp t flags kma...