在linux arm64中,如果页的大小为4KB,使用3级页表转换或者4级页表转换,用户空间和内核空间都支持有39bit(512GB)或者48bit(256TB)大小的虚拟地址空间。 如果页的大小为64KB,就只有2级页表转换,支持42bit(4TB)大小的虚拟地址,用户空间和内核空间也大小一样。 地址分布 虚拟地址都用64位无符号数表示。 用户虚拟地址...
//highmemory的开始地址是high_memory的值,大小如下: //high_memory = __va(arm_lowmem_limit - 1) + 1; //这个值加上VMALLOC_OFFSET即为vmalloc的开始地址 //#define VMALLOC_START ((unsigned long)high_memory + VMALLOC_OFFSET) //VMALLOC_OFFSET一般为8MB 1. 2. 3. 4. 5. 6. 7. 8. 9. 1...
在ARM64中,假设VA_BITS配置成48。那么kernel space空间大小是256TB,因此shadow memory的内存需要32TB。我们需要在虚拟地址空间为KASAN shadow memory分配地址空间。所以我们有必要了解一下ARM64 memory layout。基于linux-4.15.0-rc3的代码分析,我绘制了如下memory layout(VA_BITS = 48)。kernel space起始虚拟地址是0x...
然后在kernel里调用如下函数来读取memory大小等赋值给memblock变量: setup_machine_fdt(){ ... of_scan_flat_dt(early_init_dt_scan_memory,NULL); ... }int__init early_init_dt_scan_memory(unsignedlongnode,constchar*uname,intdepth,void*data) {constchar*type = of_get_flat_dt_prop(node,"device_...
4.2. shadow memory内存如何分配? 在ARM64中,假设VA_BITS配置成48。那么kernel space空间大小是256TB,因此shadow memory的内存需要32TB。我们需要在虚拟地址空间为KASAN shadow memory分配地址空间。所以我们有必要了解一下ARM64 memory layout。 基于linux-4.15.0-rc3的代码分析,我绘制了如下memory layout(VA_BITS =...
ARM64 linux kernel virtual address layout 以下内存布局信息在引导时由Linux内核在我的SoC平台上打印(带有4核Cortex-A53处理器和2.75GiB DRAM) [0.000000] Memory: 2736316K/2883584K available (4796K kernel code, 488K rwdata, 1360K rodata, 448K init, 341K bss, 130884K reserved, 16384K cma-...
ARM64 处理器架构的内核地址空间布局如下:用户空间(256T)、内核空间(256T)、module区域(128M)、PCI I/O区域(16M)、vmalloc区域(123T左右)、vmemmap区域(4096G)。 KASAN影子区域:内核地址的消毒,是一个动态内存错误的检查工具。 三、SMP/NUMA 架构
4.2. shadow memory内存如何分配? 在ARM64中,假设VA_BITS配置成48。那么kernel space空间大小是256TB,因此shadow memory的内存需要32TB。我们需要在虚拟地址空间为KASAN shadow memory分配地址空间。所以我们有必要了解一下ARM64 memory layout。 基于linux-4.15.0-rc3的代码分析,我绘制了如下memory layout(VA_BITS =...
注:以上layout来自内核文档Documentation/arm64/memory.rst。x86的位于Documentation/x86/x86_64/mm.txt 为了直观点,画了幅图: 地址空间的定义: 内核中划分的这么多区域,且都有自己对应的地址与大小,这些地址和大小在kernel中哪里定义着呢?具体位于:arch/arm64/include/asm/memory.h。以下是从中截取的片段: ...
一、ARM64 架构体系内存分布 ARM64 架构 的 " 物理地址 " 有 48 位, 理论上最大 " 寻址空间 " 为 256 TB ; ARM64 架构 的 " 虚拟地址 " 也是 最大支持 48 位 寻址地址 ; Linux内核 将 " 地址空间 " 划分为 :内核空间 和 用户空间 ; ...