宏定义符号 | 描述 | value |
VA_START | 内核地址空间的起始地址 | 0xffffff80-00000000 |
TEXT_OFFSET | bootloader会把kernel image从外设copy到RAM中,那么具体copy到什么位置呢?从RAM的起始地址开始吗?实际上是从TEXT_OFFSET开始的,偏移这么一小段内存估计是为了bootloader和kernel之间传递一些信息。所以,这里TEXT是指kernel text segment,而OFFSET是相对于RAM的首地址而言的。 TEXT_OFFSET必须要4K对齐并且TEXT_OFFSET的size不能大于2M。 | if config_arm64_randomisze_text_offset is not defined: 0x80000 = 512K
|
PAGE_OFFSET | kernel image的起始虚拟地址,一般而言也就是系统中RAM的首地址,在该地址TEXT_OFFSET之后保存了kernel image。 PAGE_OFFSET必须要2M对齐 | 0xffffffc0-00000000 |
TASK_SIZE | 一般而言,用户地址空间从0开始,大小就是TASK_SIZE,因此,这个宏定义的全称应该是task userspace size。对于ARM64的用户空间进程而言,有两种,一种是运行在AArch64状态下,另外一种是运行在AArch32状态,因此,实际上代码中又定义了TASK_SIZE_32和TASK_SIZE_64两个宏定义。 | lower VA subrange:
upper VA subrang: 0xffffff80-00000000 ~ 0xffffffff-ffffffff |
PHYS_OFFSET | 系统内存的起始物理地址。在系统初始化的过程中,会把PHYS_OFFSET开始的物理内存映射到PAGE_OFFSET的虚拟内存上去。 | adrp x24 _PHYS_OFFSET |
#define VA_BITS (CONFIG_ARM64_VA_BITS)
#define PAGE_OFFSET (UL(0xffffffff-ffffffff) << (VA_BITS - 1))
SDM845上VA_BITS是39,所以PAGE_OFFSET是 0xffffffff-ffffffff << 38 = 0xffffffc0-00000000.
#define VMALLOC_START (VA_START)
#define VA_START (UL(0xffffffffffffffff) << VA_BITS)
#define __phys_to_virt(x) ((unsigned long)((x) - PHYS_OFFSET + PAGE_OFFSET))
VA_START = 0xffffffff-ffffffff << 39 = 0xffffff80-00000000
Lower VA subrange : 从0x0000_0000_0000_0000 到 (2^(64-T0SZ) - 1)
Upper VA subrange : 从(2^64 - 2^(64-T1SZ)) 到 0xFFFF_FFFF_FFFF_FFFF
64 - T0SZ = 39
64 - T1SZ = 39
user space: 0 ~ (2^39 - 1) --> 0 ~ 0x7f-ffffffff
kernel space: (2^64 - 2^39) ~ (2^64 - 1) --> 0xffffff80-00000000 ~ 0xffffffff-ffffffff