上一篇,咱們啓動了bohcs,惋惜,沒能正常啓動,緣由是缺乏MBR。bash
從主機上按下power建以後,第一個運行的軟件是BIOS,因爲軟件不可能本身加載本身,因此BIOS確定是由硬件加載的,這個硬件就是隻讀存儲器ROM。只讀存儲器中的內容是不可擦除的,它和DRAM不一樣。ui
這塊ROM也是一塊內存,BIOS的地址被硬件映射爲0xFFFF0,而CPU中的cs:ip寄存器會在通電的一瞬間被強制初始化爲0xF000(段基址):0xFFF0(段內偏移地址),在開機的時候處於實模式,在實模式下,段基址要乘以16,也就是左移4位,因而0xF000就變成0xF0000,CPU訪問內存是用段地址+偏移地址來實現的,因此0xF0000+0xFFFF0,就變成了0xFFFF0了。這個地址,就是BIOS的入口地址。code
因爲在實模式下,只能訪問20位地址線的空間(2^20=1MB),而0xFFFF0距1MB只有16個字節了,因爲BIOS要檢測硬件,作各類初始化工做,16字節的機器指令確定幹不了這麼多事,只能說明0xFFFF0處應該是指令,而這個指令就是jmp far f000:e05b,這是條跳轉指令,也就是說fe05b纔是BIOS代碼真正開始的地方。ip
開始以後,BIOS完成它的使命以後前的最後一項工做就是校驗啓動盤中位於0盤0道1扇區的內容。也就是MBR在磁盤上最開始的那個扇區。若是此扇區的末尾是0x55和0xaa,BIOS便認爲此扇區中確實存在可執行的程序,這即是MBR。而後便加載到物理地址0x7c00,隨後跳轉到此地址,繼續執行。爲何是0x7c00呢?在IBM PC 5150 BIOS開發團隊規定的這個數。內存
MBR不是隨便放在哪裏都行的,首先不能覆蓋已有的數據,其次,不能過早地被其餘數據覆蓋。一般,MBR的任務是加載某個程序(這個程序通常是內核加載器)到指定位置,並將控制權交給它。所謂的交控制權就是jmp過去而已。以後MBR就沒用了,被覆蓋也沒有關係。開發
說了這麼多,咱們如今來寫一個MBR,咱們要編寫MBR,要先準備nasmasm
[root@makeOS software]# yum install build-essential nasm -y
;主引導程序 ;-------------------------------------------------------------------- SECTION MBR vstart=0x7c00 mov ax,cs mov ds,ax mov es,ax mov ss,ax mov fs,ax mov sp,0x7c00 mov ax,0x600 mov bx,0x700 mov cx,0 mov dx,0x184f int 0x10 mov ah, 3 mov bh, 0 int 0x10 mov ax, message mov bp, ax mov cx, 5 mov ax, 0x1301 mov bx, 0x2 int 0x10 jmp $ message db "1 MBR" times 510-($-$$) db 0 db 0x55,0xaa
[root@makeOS software]# nasm -o mbr.bin mbr.S [root@makeOS software]# ll total 12 drwxr-xr-x. 4 root root 4096 May 25 23:12 bochs -rw-r--r--. 1 root root 512 May 26 22:38 mbr.bin -rw-r--r--. 1 root root 446 Mar 18 22:57 mbr.S
咱們看到mbr.bin 是512Bytesclass
接下來咱們就該把mbr.bin寫道磁盤的0盤0道1扇區後臺
[root@makeOS software]# pwd /data/software [root@makeOS software]# ls bochs mbr.bin mbr.S [root@makeOS software]# cd bochs/ [root@makeOS bochs]# ls bin bochs.out bochsrc.disk hd60M.img share [root@makeOS bochs]# pwd /data/software/bochs [root@makeOS bochs]# dd if=/data/software/mbr.bin of=/data/software/bochs/hd60M.img bs=512 count=1 conv=notrunc 1+0 records in 1+0 records out 512 bytes (512 B) copied, 0.000148634 s, 3.4 MB/s
接下來,激動人心的時刻到了軟件
咱們在成功啓動bochs後,在控制後臺輸入c,也就是continue,就會成功輸出1 MBR的字樣。