内核是否需要从引导加载程序中获取任何内容。通常内核能够从头开始启动系统,那么为什么它需要引导加载程序中的任何内容呢?我见过这样的内核启动消息。
"Fetching vars from bootloader... OK"
那么传递的变量到底是什么?另外,如何从引导加载程序传递变量?是通过堆栈吗?
内核是否需要从引导加载程序中获取任何内容。通常内核能够从头开始启动系统,那么为什么它需要引导加载程序中的任何内容呢?我见过这样的内核启动消息。
"Fetching vars from bootloader... OK"
那么传递的变量到底是什么?另外,如何从引导加载程序传递变量?是通过堆栈吗?
Linux 内核从引导加载程序接受了一些参数,我现在能记住的是vga
参数。例如:
kernel /vmlinuz-2.6.30 root=/dev/disk/by-uuid/3999cb7d-8e1e-4daf-9cce-3f49a02b00f2 ro vga=0x318
看看你应该知道的关于 Linux 内核的 10 个启动时间参数,它解释了一些常见的参数。
内核接受所谓的基于文本的命令行选项。这非常有用,因为您无需重新编译内核就可以做很多事情。至于参数传递,它取决于架构。在 ARM 上,它是通过指向内存中某个位置或内存中固定位置的指针来完成的。
这是它在ARM上的完成方式。通常内核不能从头开始引导机器。可能来自bios,但不是从头开始。它需要一些初始化,这是引导加载程序的工作。
对于 Linux 内核,引导加载程序必须告诉内核一些事情。它包括诸如内核命令行之类的东西(正如其他几个人已经提到的那样),在内存中已加载initrd的位置及其大小,如果正在使用 initrd(内核无法自行加载它;通常在使用 initrd 时) ,访问存储设备所需的模块位于 initrd 中,并且在能够访问存储之前还必须进行一些相当复杂的设置),以及一些杂乱无章的事情。
有关传统 x86 架构(32 位和 64 位)的更多详细信息,包括如何将这些变量传递给内核设置代码,请参阅Documentation/x86/boot.txt (链接到 2.6.30 的版本)。
引导加载程序不使用堆栈将参数传递给内核。至少在 Linux 的情况下,引导加载程序填充了一个相当复杂的内存结构,内核知道如何解析。这就是引导加载程序将内核指向其命令行的方式。有关详细信息,请参阅Documentaion/x86/boot.txt。
Linux 接受来自引导加载程序的变量以允许使用某些选项。我知道您可以做的其中一件事就是让您不必登录(恢复模式),还有其他几个选项。它主要只是允许在出现问题或更改密码时进行修复。如果您选择使用其他选项,这就是 Ubuntu Live-CD 引导 Linux 的方式。
通常这些参数称为命令行参数,它是从引导加载程序传递给内核模块的。Bootloader 使用许多 BIOS 中断来检测,
memory
HDD
Processor
Keyboard
Screen
Mouse
ETC...
并且所有硬件细节都将在启动时检测到,即在实模式下,然后将此参数传递给内核。