刚才的那张页表实在是太粗糙了,我想可能是有什么历史原因导致的吧。到了真正的内核,怎么也得换个漂亮点的页表。
这次的页表就在arch/x86/kernel/head_64.S里面咯~
从cr3开始
在x86平台上保存页表起始地址的就是这个cr3寄存器了,那就先看看这个寄存器变成了谁呗。
movq $(early_level4_pgt - __START_KERNEL_map), %rax
/* Setup early boot stage 4 level pagetables. */
addq phys_base(%rip), %rax
movq %rax, %cr3
嗯,这个东西稍微有点绕。phys_base是一个偏移,我们暂且认为就是0吧。所以这次加载到cr3中的地址是early_level4_pgt - __START_KERNEL_map。这里稍微解释一下下,如果实在理解不了,暂时先跳过。
加载到cr3的是一个物理地址,而我们编译出的内核vmlinux是一个ELF文件且最终会在虚拟地址空间运行,所以所有的符号都保存的是虚拟地址。上面这两个动作就是得到early_level4_pgt这个符号在运行时的物理地址。
不管怎么样知道加载到cr3的地址