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内核模块了。

以上是粗略的说明,还需查看代码获取完整的分析信息(内核在不停演进,有些部分可能还会变化)。

 

posted @ 2016-07-31 20:56  dolinux  阅读(1225)  评论(0)    收藏  举报