上篇降到自己实现MBR的引导,但是要进入系统入口还需要做很多事情,利用grup来帮助我们引导系统,
grup 能引导多系统
http://blog.csdn.net/xiaoyi23000/article/details/50504527
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语言来写内核代码了。
由于windows 下的gcc还不支持elf_i386,只支持i386pe格式,因此要链接的话,只有在linux下的gcc来链接了。
kernel.c
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放在grup的目录中,生成磁盘映像文件。卸载即可生成。如何制作映像文件在此不阐述。
生成的映像文件作为虚拟机的启动程序
引导成功