使用GRUB2引导非多引导内核

时间:2013-07-28 14:52:41

标签: x86 osdev grub

我想用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

3 个答案:

答案 0 :(得分:6)

请参阅documentation

  

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

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

  

我的内核必须如何?

使用chainloader,GRUB可以将其视为引导扇区。最小的例子:

<强> ISO /引导/平头/的grub.cfg

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

<强> main.S

.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。

使用multibootkernel的GRUB2),内核将处于保护模式,如多引导规范所述:https://www.gnu.org/software/grub/manual/multiboot/multiboot.html#Machine-state:&#34;&#39; CR0&#39 ;必须设置位0(PE)&#34;。 Example

  

grub如何检测内核?

事实并非如此,您已经告诉我+1/boot/main.img的确切位置。{{1}}。