在arm linux 內(nèi)核啟動后谜疤,會出現(xiàn)Virtual kernel memory layout
Memory: 509624K/524288K available (6144K kernel code, 390K rwdata, 1372K rodata, 1024K init, 164K bss, 14664K reserved, 0K cma-reserved)
Virtual kernel memory layout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xffc00000 - 0xfff00000 (3072 kB)
vmalloc : 0xa0800000 - 0xff800000 (1520 MB)
lowmem : 0x80000000 - 0xa0000000 ( 512 MB)
modules : 0x7f000000 - 0x80000000 ( 16 MB)
.text : 0x(ptrval) - 0x(ptrval) (7136 kB)
.init : 0x(ptrval) - 0x(ptrval) (1024 kB)
.data : 0x(ptrval) - 0x(ptrval) ( 391 kB)
.bss : 0x(ptrval) - 0x(ptrval) ( 165 kB)
SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
這是linux 的虛擬內(nèi)核內(nèi)存布局
- vector 如果CPU支持向量重定向(控制寄存器的V位),則CPU中斷向量被映射到這里。
- fixmap 固定映射區(qū)寂汇,用來分配大頁內(nèi)存
- vmalloc虛擬內(nèi)存申請的地址范圍,實際大小
VMALLOC_END=0xf0000000 must be aligned to a 2MB boundary.
VMALLOC_END必須在2MB的邊界上對齊。 - lowmem 直接物理內(nèi)存映射區(qū)楼誓,它映射平臺的RAM蹦掐,通常所有的平臺都使用1:1的映射關(guān)系。這里是245MB喷好。大小=總物理內(nèi)存大小減去其他分區(qū)總和。0x80000000也就是PAGE_OFFSET內(nèi)核鏡像起始虛擬地址读跷。
- modules 內(nèi)核模塊空間梗搅,內(nèi)核模塊通過insmod命令加載,會動態(tài)的映射到這里
- .text 內(nèi)核映像text函數(shù)的代碼段
- .init 內(nèi)核映像(系統(tǒng)啟動過程中以__init宏標識的函數(shù)占用的空間被vmlinux.lds標識為__init_begin__init_end啟動init進程前被釋放掉)init函數(shù)的init段效览,內(nèi)核映像(同上) text函數(shù)的代碼段
- .data 內(nèi)核映像 data函數(shù)的代碼段
- .bss 內(nèi)核映像 bss函數(shù)的數(shù)據(jù)段
在內(nèi)核進行page初始化以及mmu配置之前无切,首先需要知道整個memory map。
PAGE_OFFSET
Start address of Kernel space
0xC000_0000lowmem
Kernel direct-mapped RAM region (1:1 mapping)
Maximum 896MHIGH_MEMORY
End address of lowmem
PAGE_OFFSET + MEMORY_SIZEpkmap
用來把HIGHMEM page 永久映射到 kernel space
2MB (這個大小每個平臺不一樣)
kmap() / kunmap()Page gap
To against out-of-bounds errors
8MBvmalloc
vmalloc() / ioremap() spaceDMA
DMA memory mapping regionFixmap
kmap()可能會進入睡眠丐枉,所以不能用在中斷上下文等地方.
所以Fixmap就是用于在中斷上下文中把 highmem映射到內(nèi)核空間的.
Mapping HIGHMEM pages atomically
kmap_atomic() :Fixmap在使用這個函數(shù)哆键,所以可以在中斷上下文中使用Vector
CPU vectors are mapped hereModules
Kernel modules inserted via insmod are placed here
16MB (14MB, if HIGHMEM is enabled)