- kernel 区域
start_kernel->paging_init->map_kernel会将内核镜像的各个段依次映射到该区域 ? !
- vmalloc 区域
之前ARM32可以通过bootargs去控制vmalloc区域的大小,不知道64还有没
- kasan shadow memory
- kasan:内存测试,发现use-after-free错误
- KASAN_SHADOW_START,KASAN影子内存的起始虚拟地址,大小为32TB。
- 为什么是32TB呢?因为KASAN通常使用1:8或1:16比例的内存来做影子内存,分别对应大小为256TB/8=32TB或256TB/16=16TB,这里表示的是1:8的情况所以是32TB。
- fixmap区域
- 其对应的物理地址不必是线性地址减__START_KERNEL_map
- fixmap区域是内核地址空间中的一段特殊区间,这段区间在编译时指定,也就是说是代码中写死的(不是动态分配的)。
- 在内核启动后,根据需要通过set_fixmap接口修改相应线性地址映射的物理地址(也就是修改相应的页表项),从而使相应线性地址可以动态映射到新的物理地址,
- 类似于动态分配内存的概念,与vmalloc类似,只是vmalloc的线性地址是动态分配的,而fixmap区域是编译时指定的、静态的。
从目前的代码看,主要有两个用途:
- 用于kprobe之类的工具,作为探测点的实现方式,通过修改在内核运行过程中动态修改内核代码段中的数据,从而实现实现跳转,或类似的内核运行流的控制。
- 在ioremap()可用之前(内核初始化的前期阶段),通过fixmap区域提供512个临时的boot-time mappings,在early_ioremap()中使用。
由于fixmap区域也需要动态修改地址映射,所以相应的TLB entry在地址映射修改后也需要及时刷新,所以,在修改fixmap区域的地址映射后会进行相应的TLB flush操作。