學習操作系統原理最好的方法是自己寫一個簡單的操作系統。
前面我們介紹過電腦的啓動過程:
上電->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