以前自己跟着内核内存管理的一些宏定义画过内存分布图
比如VMALLOC_START, VMALLOC_END, FIXADDR_START等等
一直以为这些值在实际内核中多多少少会有误差,没想到前几天看了一下
居然完全吻合。
来试着计算一下Vmalloc的总大小,为了便于计算我们认为1G的内核空间从0地址开始。
首先我的物理内存超过了896M,因此high_memory就是896M
其上是8M的空洞用于捕捉越界的内存访问,于是VMALLOC_START在896M+8M = 904M
下面再来计算VMALLOC_END。
最顶上是一个内存空洞,然后是固定映射的区域,这个区域的分布可以参考下面这个枚举
enum fixed_addresses {
FIX_HOLE,
FIX_VDSO,
FIX_DBGP_BASE,
FIX_EARLYCON_MEM_BASE,
#ifdef CONFIG_X86_LOCAL_APIC
FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
#endif
#ifdef CONFIG_X86_IO_APIC
FIX_IO_APIC_BASE_0,
FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
#endif
#ifdef CONFIG_X86_VISWS_APIC
FIX_CO_CPU, /* Cobalt timer */
FIX_CO_APIC, /* Cobalt APIC Redirection Table */
F