我的内核必须是什么样子?
使用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
.