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 主引導扇區
1.2 MBR成員
3.硬盤分區表DPT,占64字節
4.主引導扇區結束標志55AAH
硬盤的主引導程序代碼是從偏移0000H開始到偏移01BDH結束的446字節;主引導程序代碼包括一小段執行代碼。啟動PC 機時,系統首先對硬件設備進行測試,成功后進入自舉程序INT 19H;然后讀系統磁盤0柱面、0磁頭、1扇區的主引導扇區MBR的內容到內存指定單元0:7C00 首地址開始的區域,並執行MBR程序段。
1.3MBR功能
Error loading operating system
Missing operating system
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了。
1 org 07c00h 2 mov ax,cs 3 mov ds,ax 4 mov es,ax 5 call DispStr 6 jmp $ 7 8 DispStr: 9 mov ax,BootMessage 10 mov bp,ax 11 mov cx,16 12 mov ax,01301h 13 mov bx,000ch 14 mov dl,0 15 int 10h 16 ret 17 BootMessage: db "Antz Uhl Kone" 18 times 510-($-$$) db 0 19 20 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-($-$$) db 0 是將剩下的地址全部填 0 ,在512個字節中,0x55,0xaa占兩個字節,剩下的510個字節減去之前用過的($-$$)個字節,身下的512-2-$-$$個字節全部填0。
3.代碼生成Img鏡像
工具 : NASM , FloppyWriter
先對asm文件使用NASM編譯成為bin文件:
nasm os.asm -o os.img
此時在asm同級目錄生成了一個os.bin文件。
新建一個文件為 One_Antz.img
此時生成了一個空的img文件。
打開FloppyWriter.exe,選擇第二個
先選擇我們生成的bin文件,點擊下一步
再選擇我們創建的img文件。
鏡像就制作成功了。
生成的鏡像就是我們之前創建的img文件,內容被直接寫入了。
現在可以使用虛擬機打開我們創建的鏡像了。
設置好鏡像后打開虛擬機。