自製操作系統Antz(1)——Boot Sector
0.引子
最近在看操作系統底層方面的東西,最開始的為什麼是07c00h這個問題就讓我對操作系統有了很大的興趣。所以準備在看書之餘順便寫一個操作系統(Anz)。至於為什麼這個系統會被叫做Antz,可以參考Antz Uhl Kone(某個日漫男主的名字), 日語為アインズ·ウール·ゴウン , 與之對應的還有接下來準備寫的自製腳本語言AntzScript,因為準備是用Java實現解釋器,所以如何把AntzScript運行在Antz上是一個很大問題(其實問題就是引入Java)。
Antz系統更新地址: https://www.cnblogs.com/LexMoon/category/1262287.html
Linux內核源碼分析地址:https://www.cnblogs.com/LexMoon/category/1267413.html
1.關於Boot Sector
引導扇區(Boot Sector) 通常指設備的第一個扇區,用於載入並轉讓處理器控制權給操作系統。
1.1 主引導扇區
硬碟的0柱面、0磁頭、1扇區稱為主引導扇區,也叫主引導記錄MBR,該記錄佔用512個位元組,它用於硬碟啟動時將系統控制權轉給用戶指定的、在分區表中登記了某個操作系統分區。MBR的內容是在硬碟分區時由分區軟體寫入該扇區的,MBR不屬於任何一個操作系統,不隨操作系統的不同而不同,即使不同,MBR也不會夾帶操作系統的性質,具有公共引導的特性。但安裝某些多重引導功能的軟體或LINUX的LILO時有可能改寫它,它先於所有的操作系統被調入內存並發揮作用,然後才將控制權交給活動主分區內的操作系統。
1.2 MBR成員
1.主引導程序代碼,佔446位元組
2. 磁碟簽名
3.硬碟分區表DPT,佔64位元組 4.主引導扇區結束標誌55AAH 硬碟的主引導程序代碼是從偏移0000H開始到偏移01BDH結束的446位元組;主引導程序代碼包括一小段執行代碼。啟動PC 機時,系統首先對硬體設備進行測試,成功後進入自舉程序INT 19H;然後讀系統磁碟0柱面、0磁頭、1扇區的主引導扇區MBR的內容到內存指定單元0:7C00 首地址開始的區域,並執行MBR程序段。1.3MBR功能
1.掃描分區表查找活動分區;
2.尋找活動分區的起始扇區;3.將活動分區的引導扇區讀到內存;
4.執行引導扇區的運行代碼。 如果主引導代碼未完成這些功能,系統顯示下列錯誤信息Invalid partition table
Error loading operating system Missing operating systemMBR是BIOS接力的第一棒,在他之後,會由分區引導扇區DBR接力,至於為什麼不直接給DBR。那是因為BIOS大小有限,無法完成所有操作,在給DBR之前會通過MBR完成。
目前只需要了解MBR,至於DBR會在之後進行解釋。
2.Boot Sector實現代碼
在BIOS自檢等一系列工作完成後,要開始引導了。計算機會將硬碟0面0道1扇區512位元組載入到07c00h(0000::7c00)處。1)為什麼是0面0道1扇區?
這個可以理解為是規定,當Bios工作完成後會去將硬碟0面0道1扇區512位元組進行載入。但是真實情況是根據「魔數」來確定的,魔數就是有特殊意義的數,更大作用是用來做標記,比如MBR就是在512個位元組的最後兩個位元組填入 0x55 ,0xaa來進行標記的。放在第一個扇區是因為0面0道1扇區是磁碟最開始的地方,一開始檢驗出有 0x55 ,0xaa就直接開始載入。 2)為什麼是07c00h? 這個也可以當作是規定,在IBM文檔中沒有具體說明07c00h是為什麼,但是在世界上第一台個人計算機誕生時,07c00h就是在它當中初次誕生的,那時的DOS最多也就是32K,為了實現MBR中的棧需要512B,為了滿足需求取最大為1K,也就是32K-1K,就是07c00h了。org 07c00h
mov ax,cs
mov ds,ax
mov es,ax
call DispStr
jmp $
DispStr:
mov ax,BootMessage
mov bp,ax
mov cx,16
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
ret
BootMessage: db "Antz Uhl Kone"
times 510-($-$$) db 0
dw 0xaa55
第1行的org 07c00h已經做出講解了,它規定了程序載入的區域。
第2-4行是將ds,es和cs指向相同的地址
第5行call DispStr是調用了子程序實現字元串顯示。
在子程序DispStr中:
mov ax,BootMessage 取得顯示字元串的地址
mov bp,ax es:ax 串地址mov cx,16 cx,串長度
mov ax,01301h ah = 13 h al=01h mov bx,000ch bh = 00 頁號 bl = 0ch 字色 mov dl,0 int 10h 10h中斷 ret第6行的 jmp $是為了進行無限循環。
可以理解為當前行命令的起始地址,可以理解為當前行命令的起始地址,$是表示當前段的起始地址。
第18行的times 510-(??)db0是將剩下的地址全部填0,在512個位元組中,0x55,0xaa佔兩個位元組,剩下的510個位元組減去之前用過的()db0是將剩下的地址全部填0,在512個位元組中,0x55,0xaa佔兩個位元組,剩下的510個位元組減去之前用過的(-
)個位元組,身下的512?2?$?)個位元組,身下的512?2?$?
個位元組全部填0。
3.代碼生成Img鏡像
工具 : NASM , FloppyWriter