说明:基于arm64平台 linux5.10版本
1、内核空间布局
CONFIG_ARM64_VA_BITS=48
#define VA_BITS (CONFIG_ARM64_VA_BITS)
#define VA_START (UL(0xffffffffffffffff) - (UL(1) << VA_BITS) + 1) /* 0xFFFF 0000 0000 0000 */
#define PAGE_OFFSET (UL(0xffffffffffffffff) - (UL(1) << (VA_BITS - 1)) + 1) /* 0xFFFF 8000 0000 0000 */
#define BPF_JIT_REGION_START (VA_START + KASAN_SHADOW_SIZE) /* 0xFFFF 0000 0000 0000 先不考虑KSAN */
#define BPF_JIT_REGION_SIZE (SZ_128M)
#define BPF_JIT_REGION_END (BPF_JIT_REGION_START + BPF_JIT_REGION_SIZE) /* 0xFFFF 0000 0800 0000 */
#define MODULES_END (MODULES_VADDR + MODULES_VSIZE) /* 0xFFFF 0000 1000 0000 */
#define MODULES_VADDR (BPF_JIT_REGION_END) /* 0xFFFF 0000 0800 0000 */
#define MODULES_VSIZE (SZ_128M)
/* 线性区都有对应的struct page,假设其为64字节,这里为2T */
#define VMEMMAP_SIZE (UL(1) << (VA_BITS - PAGE_SHIFT - 1 + STRUCT_PAGE_MAX_SHIFT))
#define VMEMMAP_START (PAGE_OFFSET - VMEMMAP_SIZE) /* 0xFFFF 7E00 0000 0000 */
#define PCI_IO_SIZE SZ_16M
#define PCI_IO_END (VMEMMAP_START - SZ_2M) /* 0xFFFF 7DFF FFE0 0000 */
#define PCI_IO_START (PCI_IO_END - PCI_IO_SIZE) /* 0xFFFF 7DFF FEE0 0000 */
#define VMALLOC_START (MODULES_END) /* 0xFFFF 0000 1000 0000 */
#define VMALLOC_END (PAGE_OFFSET - PUD_SIZE - VMEMMAP_SIZE - SZ_64K) /* 0xFFFF 7DFF BFFF 0000 */
#define FIXADDR_TOP (PCI_IO_START - SZ_2M) /* 0xFFFF 7DFF FEC0 0000 */
/* __end_of_permanent_fixed_addresses最大为1k + 7 */
#define FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) /* 0xFFFF 7DFF FE7F 9000 */
2、用户空间布局
用户地址空间的大致布局如下图所示:
参考资料:
Documentation\arm64\memory.txt