上篇介绍了如何自己实现 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 目录,生成磁盘映像文件,卸载后即可完成制作。映像制作的具体过程此处不作展开。

将生成的映像文件作为虚拟机启动程序,验证引导效果:

引导成功。