自己動手從零寫桌面作業系統GrapeOS系列教程——11.MBR介紹

成宇佳發表於2023-03-08

學習作業系統原理最好的方法是自己寫一個簡單的作業系統。


前面我們介紹過電腦的啟動過程:

上電->BIOS->MBR(boot)->loader->kernel->互動介面(圖形/命令列)

本講我們要介紹的是MBR(Master Boot Record,主開機記錄)。在電腦中對磁碟的讀寫是按扇區為基本單位的,一般每個扇區為512個位元組。也就是說每讀一次磁碟,讀取的位元組數是512位元組的整數倍。同樣每寫一次磁碟,寫入的位元組數也是512位元組的整數倍。MBR是磁碟的第一個扇區,又叫做主引導扇區,特點是最後2個位元組的內容必須是0x55和0xAA。

下面我們來做幾個實驗來加深對MBR的瞭解。

1.不載入虛擬磁碟啟動QEMU

Windows鍵+R鍵開啟執行視窗,輸入cmd並回車開啟命令列視窗。

在命令列中輸入qemu-system-i386並回車:

此時會開啟QEMU視窗:

注意最後會輸出一行話“No bootable device.”,意思是沒有可引導啟動的裝置。

2.建立空虛擬硬碟

在CentOS中我們輸入如下一行命令:

dd if=/dev/zero of=/media/VMShare/GrapeOS.img bs=1M count=4

dd命令簡單來說是一個複製命令。引數if是指input file輸入檔案,引數of是指output file輸出檔案,意思就是將輸入檔案複製到輸出檔案中。這裡的輸入檔案/dev/zero是Linux中的一個特殊檔案,它可以提供無限的零。引數bs表示一次複製多少位元組資料,也就是一個資料塊的大小,count表示複製多少個塊。bs乘以count表示總共複製多少資料,我們這裡總共複製1M✖4=4M資料。執行上面這行命令的結果就是生成了一個4M大小的檔案GrapeOS.img,該檔案中每個位元組都是0。截圖如下:

由於GrapeOS.img是在Windows和CentOS的共享資料夾中,所以我們在Windows也能看到:

每個位元組都是0的檔案也叫空白檔案,我們下面用hexdump命令來驗證一下:

hexdump GrapeOS.img -C

從上面的截圖可以看到GrapeOS.img這個檔案中每個位元組都是0。

3.載入空虛擬硬碟啟動QEMU

在cmd命令列中輸入如下命令:

qemu-system-i386 d:\GrapeOS\VMShare\GrapeOS.img

上面這行命令是為QEMU指定虛擬硬碟檔案並啟動QEMU。截圖如下:

從上面截圖可以看到,雖然給QEMU指定了虛擬硬碟,但最後的提示還是“No bootable device.”

4.將虛擬硬碟的第一個扇區變為MBR

我們在Lesson11資料夾下新建檔案mbr.asm,並輸入如下程式碼:

;生成一個空的MBR
times 510 db 0 ;前510個位元組全為0
db 0x55,0xaa   ;最後兩個位元組是0x55和0xaa。

在VSCode中的截圖如下:

使用nasm彙編器彙編:

nasm mbr.asm -o mbr.bin

從上面的截圖我們看到,生成了一個叫mbr.bin的檔案,大小為512位元組。下面來看一下mbr.bin檔案中的資料:

hexdump mbr.bin -C

從上圖可以看到mbr.bin檔案中共512位元組,除最後2個位元組是0x55和0xaa,其它位元組都是0。
下面我們將mbr.bin寫入到虛擬硬碟檔案的頭512個位元組中:

dd conv=notrunc if=mbr.bin of=/media/VMShare/GrapeOS.img

上面這裡命令中多了個引數conv=notrunc,表示不截斷。如果不寫該引數,執行完命令,GrapeOS.img就只剩512位元組了。
執行完上面這行命令,我們驗證一下是否寫入成功:

hexdump /media/VMShare/GrapeOS.img -C

從上面截圖可以看到總共4MB的檔案,其中第511個位元組為0x55,第512個位元組0xaa,其它位元組都為0。此時虛擬硬碟GrapeOS.img中第一個扇區已經是MBR了。

5.載入帶MBR的虛擬硬碟啟動QEMU

在cmd命令列中輸入和剛才一樣的命令:

qemu-system-i386 d:\GrapeOS\VMShare\GrapeOS.img

截圖如下:

從上面的截圖中可以看到,在QEMU中的提示資訊已經和剛才不一樣了。最後一行顯示的是“Booting from Hard Disk...”,意思是從硬碟啟動中,也就是說程式已經從BIOS跳轉到MBR了。

透過上面的實驗我們證明只要磁碟第一個扇區中的最後兩個位元組是0x55和0xaa,BIOS就會認為該扇區是一個有效的MBR,同時認為該磁碟是一個有效的啟動項。
如果大家的實驗做到這裡會發現CPU佔用率高,如果是膝上型電腦能聽到CPU風扇呼呼的轉。這是因為CPU跑飛了,我們後面會解決這個問題。

本講小結:BIOS將電腦的控制權交棒給了MBR,我們可以在MBR中寫程式,MBR是我們程式的起點,之後電腦的執行都由我們來控制。


本講對應的影片版地址:https://www.bilibili.com/video/BV1pe4y1w7Co/
GrapeOS作業系統交流QQ群:643474045

相關文章