未解压缩时的内核页表

来源:互联网 发布:java中无参构造方法 编辑:程序博客网 时间:2024/06/02 02:20

这或许是x86平台启动过程中第一张页表了。

之前我们也学习了内核启动镜像bzImage由两部分组成setup.bin和vmlinux.bin。而这张第一章页表就在vmlinux.bin的head.S中。

如果对上述两个文件编译过程不熟悉的话可以参考下面的链接:

  • 如何编译&生成bzImage – 启动镜像
  • 真假vmlinux–vmlinux.bin揭开的秘密

先来看个代码

这第一张页表初始化的代码就在arch/x86/boot/compressed/head_64.S中。

 /*  * Build early 4G boot pagetable  */    /* Initialize Page tables to 0 */    leal    pgtable(%ebx), %edi    xorl    %eax, %eax    movl    $(BOOT_INIT_PGT_SIZE/4), %ecx    rep stosl    /* Build Level 4 */    leal    pgtable + 0(%ebx), %edi    leal    0x1007 (%edi), %eax    movl    %eax, 0(%edi)    /* Build Level 3 */    leal    pgtable + 0x1000(%ebx), %edi    leal    0x1007(%edi), %eax    movl    $4, %ecx1:  movl    %eax, 0x00(%edi)    addl    $0x00001000, %eax    addl    $8, %edi    decl    %ecx    jnz 1b    /* Build Level 2 */    leal    pgtable + 0x2000(%ebx), %edi    movl    $0x00000183, %eax    movl    $2048, %ecx1:  movl    %eax, 0(%edi)    addl    $0x00200000, %eax    addl    $8, %edi    decl    %ecx    jnz 1b    /* Enable the boot page tables */    leal    pgtable(%ebx), %eax    movl    %eax, %cr3

干这么看确实有点枯燥,不过简单来说就是分别填写了三层结构,构造出了一张覆盖4G大小的页表。

再来看一张图

看着图再去对照代码,我相信你就可以看懂了。

这里写图片描述

这样是不是清晰了很多。

代码我就不多说了,多看几遍自然就懂了。正所谓

代码虐我千百遍,我待代码如初恋

重要提醒

大家看这张表,有没有意识到什么特别的地方?

对了,虚拟地址和物理地址是一样的~

0 0
原创粉丝点击