出现的原因
因为x86体系结构的CPU在启动时是在Real Mode下运行,而Real Mode只能寻址1M以内的内存(实际给代码的内存小于512K)。这么小的空间根本不可能容纳下现在的操作系统,因此Bootloader作为在Real Mode下执行的第一个程序,其最终目的就是为了将操作系统内核加载进内存、初始化执行化环境、并将控制流跳转到内核执行入口。
多阶段的Bootloader
如前文所述,因为Bootloader只能有小于512K的代码量,但是随着业务逻辑的复杂(如从不同的介质、不同的文件系统中加载内核),512K的空间根本不可能实现这么复杂的功能,因此也就有了多阶段的Bootloader。
实现一个Bootloader的要点
-
最重要的一点,既然作为一个loader,那么必须知道如何找到并读取被加载的内容。
-
Loader工作的结束也就是内核工作的开始,因此必须为内核初始化必须的环境。
因为现在的内核都运行于Protected Mode之下,因此一般的BootLoader需要做以下工作:
- 激活A20 Line
in al, 0x92
or al, 2
out 0x92, al
- 进入保护模式(Protected Mode)
mov eax,cr0
or eax,1
mov cr0,eax
(If data selector is 10h, code selector is 8 and kernel offset is 10000h do,注意需要用far jump)
mov ax,10h
mov ds,ax
mov es,ax
mov fs,ax
mov gs,ax
mov ss,ax
jmp 8:10000h
- (可选的)设置GDT
kernel会有自己的设置
利用Grub来加载自己的内核
http://wiki.osdev.org/GRUB#Installation_and_booting
http://www.jamesmolloy.co.uk/tutorial_html/2.-Genesis.html
http://etud.insa-toulouse.fr/~projet_tut_OS/w/Bochs_%2B_Grub
在mkfs时,要注意host os所支持的file system OSX 不能挂载ext2,所以如果用OSX来做实验,可以使用-t msdos格式。
注意使用root权限,否则可能没有读取/dev/loopN的权限
Mac OSX注意事项
-
没有loop设备,因此也没有losetup命令。可以在Ubuntu环境下制作镜像
-
mkfs(Ubuntu)默认的文件格式是ext2,为了支持Mac的读写,需要指令文件系统类型为MAC支持的,如msdos
-
MAC 下update_kernel.sh参考:
#!/bin/bash
hdiutil attach -mountpoint boot_folder boot.img
cp kernel boot_folder/
hdiutil detach boot_folder
网友评论