常用全局变量
max_pfn
最大page frame number.
max_pfn = e820__end_of_ram_pfn();
MAX_PHYSMEM_BITS
最大支持物理内存
# define MAX_PHYSMEM_BITS (pgtable_l5_enabled() ? 52 : 46)
也就是说,没有5级页表的情况下,物理内存最多是64T。
phys_base
定义在head_64.S
SYM_DATA(phys_base, .quad 0x0)
EXPORT_SYMBOL(phys_base)
赋值在__startup_64()
/*
* Compute the delta between the address I am compiled to run at
* and the address I am actually running at.
*/
load_delta = physaddr - (unsigned long)(_text - __START_KERNEL_map);
RIP_REL_REF(phys_base) = load_delta;
在配置了kaslr时,内核加载地址会和编译时的地址有个偏移。phys_base就记录了这个偏移。(所以看上去这个变量名字好像不是很准确。)
在后续fixup页表,以及计算符号物理地址时(__pa_symbol)会用到。
Last updated
Was this helpful?