003-軟盤啓動原理

       軟盤,這東西雖然現在很罕見了,但是在20年前,軟盤是主要的外部存儲器,再早一點的時候還沒有硬盤,所有的數據都是存放在軟盤上的,當然也包括操作系統。我們之所以仍然選擇軟盤作爲我們操作系統的啓動介質,是因爲軟盤有着其特點和明顯的優勢。如果我說硬盤,你可能第一反應會問我多大的硬盤,因爲硬盤的種類很多。但是軟盤就沒有這麼麻煩了,普及過的軟盤就只有兩種而已,而最常用的也是使用時間最長的,就是3.5英寸軟盤,它的大小恆爲1440KB(注意寫成1.44MB是有歧義的,因爲這裏的進制一般使用1000進制或者1024進制,而3.5英寸軟盤的大小是1,474,560Byte,如果按照1024進制來算應該是1440KB或1.41MB,如果按照1000進制的話是1474KB或1.47MB,所以1.44MB的說話有點混亂了。)

       既然是1440KB,那麼對它的內容限制也就比較容易和規整。一個存儲介質,直接拿來用是非常不方便的。比如說,我們一個U盤裏有64GB的東西,但是當你把U盤插上以後,就立刻可以看到U盤裏有多少文件,剩餘空間有多少,這當然不可能是把U盤全部讀過一遍才知道的,這就說明,我們存儲介質應當是按照一定的方式來存儲文件的,一定會在某一位置存儲了一個文件的訪問索引表,所以,只需要讀取這個索引表就可以很快地知道存儲介質中的數據存儲情況,也可以快速定位。當然不僅僅是這些,針對於軟盤來說,我們還需要保存它的磁道、磁頭、扇區的信息。這些信息都需要存儲空間,我們按照一定的組織邏輯來管理數據的過程,就稱爲格式化,這也正是磁盤格式化後實際使用空間會小於原始空間的原因所在。

       一個軟盤,其實也就是一個單磁盤的硬盤,它擁有80個柱面(0-79),2個磁頭(正反面,0-1),18個扇區(1-18),每個扇區有512字節的存儲位置,所以,一張軟盤的大小就是80×2×18×512=1474560Byte=1440KB。柱面的英文是Cylindrical Surface,簡寫爲C,磁頭的英文是Head,簡寫爲H,扇區的英文是Sector,簡寫爲S,所以比如我們要表示45柱面1磁頭6扇區就應當記做C45-H1-S6。

      根據BIOS的設計,如果BIOS被設定爲軟盤啓動的話,計算機會去讀取軟盤中的數據,首先會讀取軟盤的前77個字節,來判斷軟盤的類型,在FAT12格式的軟盤中對前77個字節是這樣規定的:

開始地址 結束地址 佔用字節 作用
0x00 0x02 3 程序的第一條指令
0x03 0x0a 8 啓動區名稱
0x0b 0x0c 2 每個扇區的字節數
0x0d 0x0d 1 每簇的扇區數
0x0e 0x0f 2 FAT起始位置
0x10 0x10 1 FAT的個數
0x11 0x12 2 根目錄大小
0x13 0x14 2 磁盤大小
0x15 0x15 1 磁盤種類代碼
0x15 0x17 2 FAT長度
0x18 0x19 2 每磁道的扇區數
0x1a 0x1b 2 磁頭數
0x1c 0x1f 4 分區個數
0x20 0x23 4 磁盤大小
0x24 0x26 3 固定數據
0x27 0x27 1 卷標
0x28 0x32 11 磁盤名稱
0x33 0x3a 8 格式名稱
0x3b 0x4c 18
空行

       所以只需要按照這種方式來填寫,計算機就會以FAT12的形式來識別這張軟盤。然後,計算機會檢查這張軟盤的第510(0x1fe)和第511(0x1ff)這兩個字節的數據,如果這兩個字節的數據是0x55和0xaa的話(不爲什麼,就是一個標記,沒有什麼特殊含義),就把該軟盤的前512字節作爲啓動盤,然後執行0x0-0x2這三個字節(也可能只有前兩個字節)的機器指令。如果510和511字節不是指定的數據的話,就會認爲這張軟盤僅僅是數據盤而並非啓動盤,BIOS就會進行其他的動作(尋找其他啓動盤或者進入待機狀態)。所以,製作啓動盤的第一步,就是把前77個字節按照規定寫好,並且把510和511號位置數據寫成55和aa,最後再在前3個字節的位置寫上需要執行的命令(一般是一個跳轉指令,然後運行其他位置的指令)就OK了。

       這裏用到了一個軟件BZ,這是一個十六進制編輯器(或者叫二進制編輯器),就是用來查看和編輯一個文件的機器代碼的。當然了,要使用這個軟件就首先得有Windows操作系統才行,在以前還沒有操作系統的時候,我們是不可能借助這樣的軟件的,那就必須用實際的刻錄機直接在軟盤上燒錄才行。然而今天我們只需要模擬這個過程就好了,所以我們只做一個1440KB的img鏡像文件來作爲軟盤數據,用BZ來書寫這個文件就好了,然後我們使用VMware來加載這個img文件,相當於在實體機上插入了對應的軟盤(虛擬技術真的很方便)。當然如果感興趣,也可以通過刻錄工具吧img文件寫入軟盤。不過在這裏強調的是,把鏡像文件寫入軟盤,和把鏡像文件直接複製到軟盤,這是完全不同的操作。因爲如果你是用複製文件,那這個軟盤必須是格式化完成的,你的鏡像文件就是一個簡簡單單的文件,它會被存儲在文件區,還會在索引區生成文件的索引(其實這根本不可能,因爲你沒有辦法在1440KB的軟盤中複製一個1440KB的文件,根本拷貝不下),而並不是把軟盤按照我們鏡像文件中的那種方式來書寫,這一點有很多朋友都一直搞不清楚。(照理說如果不使用軟件而是單純的使用刻錄機的話就不會出現這樣難理解的問題,就是因爲有了現在這樣方便的工具,才讓我們理解底層實現的難度變得更高,所以針對這些問題來說,到底是多想點好呢還是少想點好呢?)不太放心,還是再解釋解釋吧。比如說,我現在想在軟盤中寫上“12345abcde”,那麼我就直接用刻錄機在軟盤上寫上“12345abcde”就可以了,這沒有任何問題。但是,什麼是鏡像文件呢,就是這裏有一個文件,文件裏的內容是"12345abcde000000000000000……",後面的那些0就是在實際軟盤上應該都寫成0,所以這個文件就是軟盤裏實際應該有的情況,一共1440KB,使用軟件把img文件加載到軟盤上的意思就是,參照img文件的樣子,把軟盤也寫成“12345abcde00000000000……”這樣,但是如果你把這個文件拷貝到軟盤裏(假設能考進去的話),軟盤裏實際的樣子應該是"xxxxxx00000123.img0000012345abcde00000……zzzzzz",解釋一下,前面的xxxxx就表示軟盤格式化時寫入的文件信息,後面是文件列表和索引,然後纔是文件內容,最後還有一些其他的信息,所以,把文件直接拷貝到軟盤中的話,軟盤中的實際情況並不是我們需要的那樣了。

       至此,啓動盤就寫好了,接下來的工作就是要寫上一句合適的指令,然後執行ipl的內容,下次會說明img的具體寫法以及ipl的啓動。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章