【问题标题】:What is the enviroment when exec the kernel code执行内核代码时的环境是什么
【发布时间】:2018-04-08 20:12:14
【问题描述】:

对于 x86,内核由 bios 在 0x7c00 加载并在那里执行。 我不熟悉内核映像,并且在 0x7c00 处执行时对环境感到困惑。我最近研究了 ELF 格式,知道可加载文件中有很多扇区,ld 加载 ELF 文件并在程序执行时初始化环境。但是对于内核引导案例,发生了什么?

【问题讨论】:

标签: assembly linux-kernel


【解决方案1】:

首先,内核不是由 BIOS 或固件在 0x7c00 加载的,而是在那里加载了“引导加载程序”。在 x86/IA32 系统上,系统软件的初始环境是 16 位模式(称为实模式)。在实模式下,为了访问内存,代码使用段:偏移内存寻址系统。这允许使用超过 16 位大小的线性地址。

BIOS 没有用于引导加载程序的文件系统的概念。只有来自磁盘引导扇区的 512 字节被加载并复制到 0x7c00 地址。代码必须准备好在没有任何重定位/链接的情况下在那里执行,因为 BIOS 不知道这些。此外,引导加载程序的条目必须仅位于 0x7c00,因此无法加载 elf 文件(在最开始时包含标头),因为代码不在开头。因此,引导加载程序采用原始二进制文件的形式。

BIOS 为使用系统上的设备提供服务

int <systemCallIndex>

指令,加载的 512 字节必须用于加载磁盘上的其他扇区。这是一个非常低级的任务,可能非常有问题。与这里相比,在用户空间中编程非常容易。

请注意,引导加载程序文件可以是任意大小,但前 512 字节将由 BIOS 加载。因此,此代码将加载磁盘上的其他扇区。

引导加载程序加载内核:

引导加载程序设置系统以供内核使用。像 GRUB 这样的高级引导加载程序甚至可以加载 elf 文件并读取普通文件系统(如 FAT)。因此,内核获得了比引导加载程序更高级别的环境。一些加载器,如 GRUB2 允许加载其他内核模块并为内核设置保护模式。

如需更深入的信息,请访问 osdev.org

【讨论】:

  • 这仅适用于传统 BIOS 引导,不适用于现代 PC 等以 EFI 模式引导时。
  • 我提到过BIOS是这样工作的,但是没有提到EFI。
猜你喜欢
  • 2021-11-16
  • 2022-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 2011-04-12
  • 2023-04-04
  • 2021-04-08
  • 1970-01-01
相关资源
最近更新 更多