当使用虚拟地址指定 elf 文件并且在内核加载之前未设置 MMU 时,linux 引导加载程序如何将 vmlinux 文件加载到内存中?

问题描述

我很困惑。当我在 x86_64 ubuntu 机器上看到 /boot/grub/grub.cfg 时,grub 使用 vmlinuz-4.15-..-generic 文件作为内核映像。 vmlinuz 将是 vmlinux 的一个压缩文件,而 vmlinux 是一个 elf 文件,在许多节中有许多目标代码和数据。 elf 文件中的地址是“虚拟”地址而不是物理地址。虚拟->物理地址转换是通过内核设置的页表和MMU硬件完成的。
这是从 vmlinux 为 aarch64 解码的代码的开始。(我从 aarch64-none-elf-objdump -D vmlinux 得到这个)

ffff800010080000 <_text>:
ffff800010080000:       91005a4d        add     x13,x18,#0x16
ffff800010080004:       1447ffff        b       ffff800011280000 <stext>
ffff800010080008:       00080000        .inst   0x00080000 ; undefined
ffff80001008000c:       00000000        .inst   0x00000000 ; undefined
ffff800010080010:       01938000        .inst   0x01938000 ; undefined

内核文本从虚拟地址 0xffff800010080000 开始。在执行内核之前,以及在完成页表和 MMU 设置之前,引导加载程序如何将内核映像的各个部分放置到每个虚拟地址?我想我不知道这里有一件非常重要的事情。请有人帮助我。或者,引导加载程序是否设置了 mmu 表?(再想一想,我想这可能是唯一的解决方案)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)