您當前的位置:首頁 > 攝影

自制作業系統Antz(1)——Boot Sector

作者:由 AntzUhl 發表于 攝影時間:2019-04-06

0.引子

最近在看作業系統底層方面的東西,最開始的為什麼是07c00h這個問題就讓我對作業系統有了很大的興趣。所以準備在看書之餘順便寫一個作業系統(Anz)。至於為什麼這個系統會被叫做Antz,可以參考Antz Uhl Kone(某個日漫男主的名字), 日語為アインズ·ウール·ゴウン , 與之對應的還有接下來準備寫的自制指令碼語言AntzScript,因為準備是用Java實現直譯器,所以如何把AntzScript執行在Antz上是一個很大問題(其實問題就是引入Java)。

Antz系統更新地址:

https://www。

cnblogs。com/LexMoon/cat

egory/1262287。html

Linux核心原始碼分析地址:

https://www。

cnblogs。com/LexMoon/cat

egory/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 system

MBR是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

07

c00h

mov

ax

cs

mov

ds

ax

mov

es

ax

call

DispStr

jmp

$

DispStr

mov

ax

BootMessage

mov

bp

ax

mov

cx

16

mov

ax

01301

h

mov

bx

000

ch

mov

dl

0

int

10

h

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,axes:ax 串地址

mov cx,16cx,串長度

mov ax,01301h ah = 13 h al=01h

mov bx,000chbh = 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

自制作業系統Antz(1)——Boot Sector

先對asm檔案使用NASM編譯成為bin檔案:

nasm os。asm -o os。img

自制作業系統Antz(1)——Boot Sector

此時在asm同級目錄生成了一個os。bin檔案。

新建一個檔案為 One_Antz。img

自制作業系統Antz(1)——Boot Sector

自制作業系統Antz(1)——Boot Sector

此時生成了一個空的img檔案。

開啟FloppyWriter。exe,選擇第二個

自制作業系統Antz(1)——Boot Sector

先選擇我們生成的bin檔案,點選下一步

自制作業系統Antz(1)——Boot Sector

再選擇我們建立的img檔案。

自制作業系統Antz(1)——Boot Sector

映象就製作成功了。

自制作業系統Antz(1)——Boot Sector

生成的映象就是我們之前建立的img檔案,內容被直接寫入了。

現在可以使用虛擬機器開啟我們建立的映象了。

自制作業系統Antz(1)——Boot Sector

設定好映象後開啟虛擬機器。

自制作業系統Antz(1)——Boot Sector

標簽: 扇區  位元組  MBR  引導  512