上篇介绍了如何自己实现 MBR 引导,但要真正进入系统入口还需要完成更多工作。这里借助 GRUB 来帮助我们完成系统引导。
GRUB 支持多系统引导,相关参考资料:http://blog.csdn.net/xiaoyi23000/article/details/50504527
Multiboot 引导头(boot.asm)
以下是符合 Multiboot 规范的汇编引导代码:
MBOOT_MAGIC equ 0x1BADB002;
MBOOT_FLAGS equ 0x00;
MBOOT_CHECKSUM equ -(MBOOT_MAGIC + MBOOT_FLAGS);
[BITS 32]
section .text
dd MBOOT_MAGIC
dd MBOOT_FLAGS
dd MBOOT_CHECKSUM
dd start
[GLOBAL start]
[EXTERN kernel_entry]
start:
cli;禁止中断,保护模式下不能用bios提供的中断功能
call kernel_entry; 调用内核入口函数
jmp $
完成这一步之后,就可以开始用 C 语言编写内核代码了。
内核入口(kernel.c)
需要注意的是,Windows 下的 GCC 尚不支持 elf_i386 格式,只支持 i386pe,因此链接步骤需要在 Linux 下的 GCC 中完成。
const char *VGA_BUFFER = (const char*)0x000b8000;// vga 显存开始地址
int kernel_entry()
{
while (1);
return 0;
}
编译与链接
- 编译引导:
nasm -f elf boot.asm -o boot.o - 编译内核代码:
gcc -masm=intel -c -nostdlib kernel.c -o boot.o - 链接引导和内核代码:
ld -T link.ld -m elf_i386 -nostdlib boot.o kernel.o -o kernel
生成磁盘映像
挂载 mnt 后,将生成的 kernel 文件放入 GRUB 目录,生成磁盘映像文件,卸载后即可完成制作。映像制作的具体过程此处不作展开。
将生成的映像文件作为虚拟机启动程序,验证引导效果:
引导成功。