我想用GRUB2启动自定义内核(非多启动),我已经读过这样的需要grub.cfg
:
menuentry "custom kernel" {
set root=(hd0,0)
chainloader +1
}
所以,我有一些问题:
kernel /boot/kernel.bin
)(hd0,0)
是硬盘分区,如果我使用CD,我必须放置什么?也许(cdrom0,0)
?linux
命令,我可以使用它来启动我的自定义内核(有一些更改)吗?Protected mode
?答案 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。
使用multiboot
(kernel
的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}}。