出現(xiàn)的原因
因?yàn)閤86體系結(jié)構(gòu)的CPU在啟動(dòng)時(shí)是在Real Mode下運(yùn)行,而Real Mode只能尋址1M以內(nèi)的內(nèi)存(實(shí)際給代碼的內(nèi)存小于512K)。這么小的空間根本不可能容納下現(xiàn)在的操作系統(tǒng),因此Bootloader作為在Real Mode下執(zhí)行的第一個(gè)程序,其最終目的就是為了將操作系統(tǒng)內(nèi)核加載進(jìn)內(nèi)存、初始化執(zhí)行化環(huán)境、并將控制流跳轉(zhuǎn)到內(nèi)核執(zhí)行入口。
多階段的Bootloader
如前文所述,因?yàn)锽ootloader只能有小于512K的代碼量,但是隨著業(yè)務(wù)邏輯的復(fù)雜(如從不同的介質(zhì)、不同的文件系統(tǒng)中加載內(nèi)核),512K的空間根本不可能實(shí)現(xiàn)這么復(fù)雜的功能,因此也就有了多階段的Bootloader。
實(shí)現(xiàn)一個(gè)Bootloader的要點(diǎn)
最重要的一點(diǎn),既然作為一個(gè)loader,那么必須知道如何找到并讀取被加載的內(nèi)容。
Loader工作的結(jié)束也就是內(nèi)核工作的開(kāi)始,因此必須為內(nèi)核初始化必須的環(huán)境。
因?yàn)楝F(xiàn)在的內(nèi)核都運(yùn)行于Protected Mode之下,因此一般的BootLoader需要做以下工作:
- 激活A(yù)20 Line
in al, 0x92
or al, 2
out 0x92, al
- 進(jìn)入保護(hù)模式(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
- (可選的)設(shè)置GDT
kernel會(huì)有自己的設(shè)置
利用Grub來(lái)加載自己的內(nèi)核
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時(shí),要注意host os所支持的file system OSX 不能掛載ext2,所以如果用OSX來(lái)做實(shí)驗(yàn),可以使用-t msdos格式。
注意使用root權(quán)限,否則可能沒(méi)有讀取/dev/loopN的權(quán)限
Mac OSX注意事項(xiàng)
沒(méi)有l(wèi)oop設(shè)備,因此也沒(méi)有l(wèi)osetup命令??梢栽赨buntu環(huán)境下制作鏡像
mkfs(Ubuntu)默認(rèn)的文件格式是ext2,為了支持Mac的讀寫(xiě),需要指令文件系統(tǒng)類型為MAC支持的,如msdos
MAC 下update_kernel.sh參考:
#!/bin/bash
hdiutil attach -mountpoint boot_folder boot.img
cp kernel boot_folder/
hdiutil detach boot_folder