Make a bootloader
以 x86 來說, BIOS 在執行完所有任務後, 最後一件事就是
搜尋 floppy, hard disk, cdrom 的 cylinder 0, head 0, sector 1
(在 hard disk 上稱做 MBR)並將該 sector (512 bytes) 載入記憶體的
0x0000:7C00 開始執行. 在 MBR 還會多檢查最後 2 bytes 是否為 0x55AA
所以我們最簡單的 boot code 如下
[BITS 16]
[org 0x7C00]
start:
mov si,MSG
call print_string
jmp $
print_string: ; Expects null terminated message in si
mov al,[si]
or al,al
jz .end
inc si
call print_char
jmp print_string
.end:
retn
print_char:
mov ah,0x0E ; Specifies that we want to write a character to the screen
mov bl,0x07 ; Specifies output text color. Not required, but useful to know
mov bh,0x00 ; Page number. Leave this alone.
int 0x10 ; Signal video interrupt to BIOS
retn
;data
MSG db 'Welcome My Operating System!',0x0A,0
TIMES 510 - ($ - $$) db 0 ; clear 0 between data and 0xAA55
DW 0xAA55
用 nasm build binary executable file
nasm -f bin -o boot.bin boot.asm
Test with VirtualBox (version: 4.2.0)
首先, 用VirtualBox新增一個虛擬機器, 類型跟作業系統可以選 Windows, Windows XP建立完成後, 找到這個虛擬機器的 hard disk file (.vdi) 用 HEX Editor 打開
找到這個位址 0x0000:0150 如下
紅框內的值就代表這個 vdi file 的 MBR 在 0x0000:2000
接下來把 boot.bin 的 512 bytes 完全 copy 到 0x0000:2000~0x0000:21FF
就大功告成了, 開機畫面如下
Reference
Using Virtualbox as a bootloader testing environmentX86 開機流程小記
Operating System Development - bootloader
沒有留言:
張貼留言