ARM架構的Linux內核的空間佈局
ARM32bit kernel布局
这是一张示意图(有些地址可能会有差异)

整个地址空间是4G,kernel被配置为1G,程序占3G。
任何程序都有TEXT(可执行代码),RW(数据段),ZI段(未初始化数据段),kernel也有,对应的是.text,.data,.bss。 而内核代码开始的地址是0xC0008000,前面放页表(起始地址为0xC0004000),如果支持模块(*.ko)那么地址在 0xBF000000。
由于kernel没办法将所有内存都映射进来,毕竟kernel自己只占1G,如果RAM超过1G,就无法全部映射。怎么办呢?只能先映射一部分了,这部分叫low memory。其他的就按需映射,VMALLOC区域就是用于按需映射的。
ARM的外设寄存器和内存一样,都统一地址编码,因此0xF0000000以上的一段空间用于映射外设寄存器,便于操作硬件模块。
0xFFFF0000是特殊地址,CPU用于存放异常向量表,kernel异常绝大部分都是CPU异常(MMU发出的abort/undef inst.等异常)。
如tq2440開發板的內容容量爲64MB,在啓動的時候,kernel會打印出內存佈局:
[ 0.000000] Memory: 59240K/65536K available (3912K kernel code, 214K rwdata, 1176K rodata, 155K init, 176K bss, 6296K reserved) [ 0.000000] Virtual kernel memory layout: [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) [ 0.000000] vmalloc : 0xc4800000 - 0xff000000 ( 936 MB) [ 0.000000] lowmem : 0xc0000000 - 0xc4000000 ( 64 MB) [ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB) [ 0.000000] .text : 0xc0008000 - 0xc05002f0 (5089 kB) [ 0.000000] .init : 0xc0501000 - 0xc0527edc ( 156 kB) [ 0.000000] .data : 0xc0528000 - 0xc055d8f8 ( 215 kB) [ 0.000000] .bss : 0xc055d8f8 - 0xc0589c84 ( 177 kB)
ARM64bit kernel-3.10布局
Start End Size Use ----------------------------------------------------------------------- 0000000000000000 0000007fffffffff 512GB user ffffff8000000000 ffffffbbfffeffff ~240GB vmalloc ffffffbbffff0000 ffffffbbffffffff 64KB [guard page] ffffffbc00000000 ffffffbdffffffff 8GB vmemmap ffffffbe00000000 ffffffbffbbfffff ~8GB [guard] ffffffbffbc00000 ffffffbffbdfffff 2MB early con I/O space ffffffbffbe00000 ffffffbffbffffff 2MB PCI I/O space ffffffbffc000000 ffffffbfffffffff 64MB modules ffffffc000000000 ffffffffffffffff 256GB kernel logical memory map
ARM64bit kernel-3.18布局
Start End Size Use ----------------------------------------------------------------------- 0000000000000000 0000007fffffffff 512GB user ffffff8000000000 ffffffbdfffeffff ~247GB vmalloc ffffffbdffff0000 ffffffbdffffffff 64KB [guard page] ffffffbe00000000 ffffffbfbfffffff 7GB vmemmap ffffffbfc0000000 ffffffbffbdfcfff 957MB [guard] ffffffbffbdfd000 ffffffbffbdfefff 8KB fixed mappings ffffffbffbdff000 ffffffbffbffffff ~2MB [guard] ffffffbffc000000 ffffffbfffffffff 64MB modules ffffffc000000000 ffffffffffffffff 256GB kernel logical memory map
这是39bit的kernel空间,由于多达512GB的空间,因此完全可以将整个RAM映射进来,0xFFFFFFC000000000之后就是一一映射了,就无所谓high memory了。
vmalloc还是存在,因为可以将不连续的物理内存拼接成连续的虚拟内存,可以解决部分内存碎片问题。而且外设寄存器也直接映射到vmalloc了,就没有32bit布局里的IO map space了。
modules对应的就是*.ko内核模块了。
以上是粗略的说明,还需查看代码获取完整的分析信息(内核在不停演进,有些部分可能还会变化)。
本文来自博客园,作者:dolinux,未经同意,禁止转载

浙公网安备 33010602011771号