深入分析Linux kernel exception框架

来源:互联网 发布:js 0 100两位小数 编辑:程序博客网 时间:2024/06/11 01:01

kernel space

在分析KE前,你要了解kernel内存布局,才知道哪些地址用来做什么,可能会是什么问题。目前智能机已进入64bit,因此就存在32bit布局和64bit布局,下面一一讲解。

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.等异常)。

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

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

0 0
原创粉丝点击