3

我想用 GRUB2 引导一个自定义内核(非多重引导),我读过我需要grub.cfg这样:

menuentry "custom kernel" {
    set root=(hd0,0)
    chainloader +1
}

所以,我有一些问题:

  1. grub如何检测内核?(我使用了多重引导规范kernel /boot/kernel.bin
  2. 我的内核必须是什么样子(对不起我的英语不好)?它必须是 512 字节吗(如自定义引导加载程序,加载到 0x7c00 中)?
  3. (hd0,0)是硬盘分区,如果我使用CD,我必须放什么?也许(cdrom0,0)
  4. 要启动 Linux 内核,我们可以使用linux命令,我可以使用它来启动我的自定义内核(进行一些更改)吗?
  5. Grub 会进入Protected mode还是不进入?
4

3 回答 3

7

请参阅文档

Multiboot(参见 Multiboot Specification)是 GRUB 支持的本机格式。为方便起见,还支持 Linux、FreeBSD、NetBSD 和 OpenBSD。如果要引导其他操作系统,则必须链式加载它们(请参阅链式加载)。

因此,对于您的非多重引导内核,您必须使用链加载器功能。链式加载意味着 GRUB 将加载指定硬盘分区的第一个扇区(512 字节)并像 BIOS 引导 MBR 一样引导它。这意味着 CPU 处于实模式并且您的引导扇区加载在 0x7C00。

是的,您可以使用该命令启动您的内核linux,使其与 Linux 启动过程兼容,但这比简单地使您的内核兼容多重启动更复杂。

于 2013-07-29T10:15:36.223 回答
3

当计算机启动时,它从硬盘的开头加载一个扇区(512字节)到内存位置0x7C00,并执行它。这是在实模式下。当您使用 GRUB 时,它会将自己的代码安装到该区域(MBR 或主引导记录)。存在链加载的原因是其他操作系统有自己的引导加载程序。它允许 GRUB 用作主引导加载程序,但是当它链式加载条目时,它会从条目所在的分区加载 512 个字节,并以实模式加载到 0x7C00,并假装计算机正在加载。这意味着操作系统可以安装到其 VBR(卷引导记录)中,而不是安装到 MBR,如果用户选择该操作系统,则由 GRUB 加载它。

如果你走这条路,无论如何你都必须编写自己的引导加载程序,除非你想加载多个操作系统,否则使用 GRUB 是没有意义的。只使用多重引导会更容易,因为 GRUB 进入保护模式并为您启用 A20 线。我不知道Linux格式,但是对于一个简单的内核来说,它肯定有点过分。如果你走得更远,那么切换到 Linux 格式 - 或者甚至为自定义格式编写自己的引导加载程序 - 可能会很有用。

于 2013-07-30T18:36:31.037 回答
3

我的内核必须是什么样子?

使用chainloader, GRUB 使其被完全视为引导扇区。最小的例子:

iso/boot/grub/grub.cfg

menuentry "hello-world" {
    chainloader /boot/main.img
}

电源

.code16
.global _start
_start:
    cli
    /* Sane programs should also do some extra
     * initialization here like stack and segments.
     */
    mov $0x0E61, %ax
    /* BIOS call that prints 'a' to screen. */
    int $0x10
    hlt

编译运行

as -o main.o main.S
/* Sane programs should use a dedicated linker script. */
ld --oformat binary -o main.img -Ttext 0x7C00 main.o
cp main.img iso/boot/
grub-mkrescue -o main.iso iso
qemu-system-i386 -hda main.iso

在 Ubuntu 14.04 ADM64 上测试。

预期结果:a打印到屏幕上。

GitHub 存储库上的此示例:https ://github.com/cirosantilli/x86-bare-metal-examples/tree/cba0757990843f412b14dffad45467ad0034d286/grub/chainloader

Grub 是否会进入保护模式?

由于chainloader我们使用了 BIOS,因此我们仍处于实模式。

使用multiboot(GRUB2 for kernel) 内核处于保护模式,如 Multiboot 规范中所述:https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Machine-state : "'CR0'必须设置位 0 (PE)”。例子

grub如何检测内核?

它没有,你已经告诉它在哪里查看+1我的/boot/main.img.

于 2015-10-03T08:48:37.767 回答