+ -
当前位置:首页 → 问答吧 → head.s 汇编几个迷惑

head.s 汇编几个迷惑

时间:2010-08-03

来源:互联网

如下代码:

3:
        movl $swapper_pg_dir-__PAGE_OFFSET,%eax
        movl %eax,%cr3                /* set the page table pointer.. */
        movl %cr0,%eax
        orl $0x80000000,%eax
        movl %eax,%cr0                /* ..and set paging (PG) bit */
        jmp 1f                        /* flush the prefetch-queue */
1:
        movl $1f,%eax
        jmp *%eax                /* make sure eip is relocated */
1:
        /* Set up the stack pointer */
        lss stack_start,%esp

问题1,为什么 jmp 1f 不能将 eip 从物理地址转换成虚拟地址,  movl $1f,%eax  jmp *%eax 就可以?
是不是编译后,  jmp 1f 中的 1f 被翻译成了相对于当前指令地址的相对偏移, 而 movl $1f,%eax 确实将 lss stack_start,%esp 的绝对地址存入了 eax?

问题2, 3: 1: 1: 这些标号在二进制 binary 中的值到底是什么, 是相对于binary 文件第一个字节的偏移, 还是相对于binary文件text段的第一个字节的偏移, 还是在这个偏移量上又加上 1MB(内核加载基地址)呢

问题3, 从 movl $swapper_pg_dir-__PAGE_OFFSET,%eax 看, 似乎在分页启动之前, $swapper_pg_dir 保存的就已经是 0xc0000000 以上的地址了, 这个地址是怎么得出的呢?
无论从相对于某个起始点的偏移量还是在偏移量上再加上基地址, 似乎都不能得到这个数字。

作者: zylthinking   发布时间: 2010-08-03

第 2, 3 个问题我想我明白了, 在编译内核的时候,  0xc0000000 和 1MB 这两个值是都有指定的, 那么所有地址估计在编译器的安排下, 都已经静态赋值成正确的虚拟地址了

作者: zylthinking   发布时间: 2010-08-03

热门下载

更多