ARM64内核地址空间布局(一)

666 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

32位和64位的布局其实有很大的差异,但是由于目前32位的产品比较少,我就重点说64位了。

再进行64位内核地址空间说明前,我们先来看一下下面的图,这张图是32位地址空间,可以看到整个空间分为1G的内核空间和3G的用户空间,这也是为什么大家都说用户空间3G,内核空间1G的根本原因,这些特性均是由空间布局决定的

43455_16572724544065.png

下面这张图是64位的空间布局图,此处需要说明下,目前在ARM64上目前还不完全支持64位的虚拟地址,且从图中可以看出,内核占据高的空间,用户空间占据的是低的空间,且不是64位的。用户空间和内核空间分别多大,就要看地址宽度了,下图中的地址宽度是48(如用户空间是0x0000 0000 0000 0000 - 0x0000 FFFF FFFF FFFF,12个F,每个F占据4位,因此地址宽度就是12 * 4 = 48),当地址宽度不同时,用户空间和内核空间的大小也会不一样的。

43455_16572724544065.png

下面我们重点看一下的空间布局。 内核空间是比较复杂的,有kasan影子区域(Kasan shadow region),内核模块区域,vmalloc区域,固定映射区(fixed mappings),PCI I/O space,vmemmap和线性映射区域,同时还有一些间隙。

下面我们挨着区域一个一个的说明下: kasan影子区域,Kasan是Kernel address sanitizer的缩写,英文单词直译就是内核地址消毒剂,这个消毒剂正好也解释了该区域的用途,是一个动态的内存错误检查工具,该区域的起始地址是内核虚拟地址空间的起始地址,可以用来检测一些越界,use-after-free等问题,kasan的实现机制实际上就是使用了额外的空间来对使用的内存进行标记,他的长度是内核虚拟地址空间长度的1/8,这个比例也是同Kasan的机制有关,再后面我也会进行说明这部分。

其他区域留在后面的文章中进行介绍