編寫MBR主引導記錄,開始掌權 一.一些說明 CPU的硬體電路被設計成只能運行處於記憶體中的程式,這是硬體基因的問題,其原因是首先記憶體比較快且容量大,其次由於各個硬體特性不同,若被設計成運行硬體里的程式則操作系統要分別考慮每種硬體特性才行,為了達到統一,故選擇只運行記憶體中的程式。其次記憶體不僅僅是DRA ...
編寫MBR主引導記錄,開始掌權
一.一些說明
CPU的硬體電路被設計成只能運行處於記憶體中的程式,這是硬體基因的問題,其原因是首先記憶體比較快且容量大,其次由於各個硬體特性不同,若被設計成運行硬體里的程式則操作系統要分別考慮每種硬體特性才行,為了達到統一,故選擇只運行記憶體中的程式。其次記憶體不僅僅是DRAM,即記憶體不僅僅是主板上的記憶體條(物理記憶體),包括外設的ROM等。
載入記憶體分為兩部分:第一部分是程式被載入器(軟體或硬體)載入到記憶體的某個區域,第二部分是設置CPU的CS:IP寄存器指向這個程式的起始地址。
上面說過,主板上的物理記憶體不是它眼裡的“全部的記憶體”。電腦中,並不是只有咱們插在主板上的記憶體條需要通過地址匯流排訪問,還有一些外設同樣是需要地址匯流排來訪問的。若把全部的地址匯流排用來指向物理記憶體那麼其他設備訪問不了。由於這個原因只好在地址匯流排上提前預留出來一些地址空間用於存放這些外設,比如把連續的地址分配給顯存,連續的地址分配給硬碟控制器等。留夠了以後,地址匯流排上其餘的可用地址再指向DRAM,也就是指插在主板上的記憶體條,我們眼中的物理記憶體。
這也即是為什麼電腦安裝了8G,卻顯示7.8G的原因。
總之,表示地址的那串數字是地址匯流排的輸入,相當於其參數,和記憶體條沒關係。CPU能夠訪問一個地址,這是由於地址匯流排給的映射。相當於對該地址分配了一個存儲單元。而該單元要麼落在某個ROM上,要麼落在物理記憶體條上,要麼落在了某個外設的記憶體中。
二.關於磁碟的一些說明
“0 盤”說的是 0 磁頭,因為一張盤是有上下 兩個盤面的,一個盤面上對應一個磁頭,所以用磁頭 Header 來表示盤面。“0 道”是指 0 柱面,柱面 Cylinder 指的是所有盤面上、編號相同的磁軌的集合,形象一點描述就是把很多環疊摞在一起的樣子,組合在一起 之後是一個立體的管狀。“1 扇區”才是我們要解釋的部分,將磁軌等距劃分成一段段的小區間,由於磁 道是圓形的,確切地說是圓環,這些被劃分出來的小區間便是扇形,所以稱為扇區。
三.BIOS基本輸入輸出系統
從主機上按下POWER鍵後,第一個運行的軟體是BIOS(基本輸入輸出系統)。BIOS主要工作是檢測,初始化硬體,怎麼初始化的?硬體自己提供了一些初始化的功能調用,BIOS直接調用即可。不僅如此,BIOS還做了一個很重要的事,填寫了中斷向量表,這樣就可以通過“int 中斷號”來實現相關的硬體調用,當然BIOS建立的這些中斷功能就是對硬體IO操作,也即輸入輸出。但是BIOS總共只有64KB,不可能把所有硬體的IO實現做的面面俱到,而且也沒必要實現那麼多因為在實模式下,對硬體支持得再豐富也是白搭,精彩的世界是進入保護模式以後才開始的,所以挑選一些重要的基本IO操作即可,這也是為什麼稱其為基本的原因。
BIOS如何啟動的?因為BIOS是電腦上的第一個啟動的軟體,它不可能自己載入自己。由此可知道,它是由硬體載入的。這個硬體便是只讀存儲器ROM(硬體本身有一定的功能),此後,BIOS便被寫入到該ROM中去,ROM也是塊記憶體,於是被映射到低端的1MB處即0xf0000~0xfffff處,此後CS:IP被強制設置為0xf000:0xfff0(無論如何只要處理完後的地址是0xffff0即可為該16B為BIOS的入口地址)。只要訪問該區間內的地址(映射所對應的存儲單元,該映射是由硬體系統完成的)便是訪問BIOS系統。
另外,因為 cs 和 ip 寄存器中存儲的是下一條要執行的指令,目前還沒有執行,也就是說,當前還沒有 執行 BIOS,這是機器剛開機的那一刻。接下來BIOS就開始盡其責了,檢測記憶體,顯卡外設等,並初始化好硬體,開始在記憶體0x000~0x3ff處建立數據結構,中斷向量表IVT並填寫中斷常式。
BIOS 最後一項工作校驗啟動盤中位於 0 盤 0 道 1 扇區的內容。如果此扇區末尾的兩個位元組分別是魔數 0x55 和 0xaa,BIOS 便認為此扇區中確實存在可執行的程式(在此先劇透一下,此程式便是久聞大名的主引導記錄 MBR,MBR位於磁碟上最開始的那個扇區),便載入到物理地址 0x7c00,隨 後跳轉到此地址,繼續執行,如果此扇區的最後 2 個不是 0x55 和 0xaa,即使裡面有可執行代碼也無濟於事了,BIOS 不認。
那麼會有兩個疑問MBR為什麼規定在為什麼是 0 盤 0 道 1 扇區?為什麼要載入到 0x7c00,而不是個好記或好看的其他地址?
第一個問題:我自行猜測很可能是為了約定,因為如果不告訴BIOS系統MBR在哪?BIOS系統會一遍遍的遍歷所有硬碟直到碰見了0x55和0xaa兩個魔數才知道是MBR所在位置,這樣不如直接索性規定MBR在開始的扇區(可以是任意扇區,只要是固定位置即可),告訴BIOS系統 MBR在哪?這樣方便很多
第二個問題:個人電腦肯定要運行操作系統,在這台電腦上,運行的操作系統是 DOS 1.0,不清楚此系統要求 的最小記憶體是 16KB,還是 32KB,反正 PC 5150 BIOS 研發工程師就假定其是 32KB 的,所以此版本 BIOS 是按最小記憶體 32KB 研發的。很簡單,MBR首先其安裝不能覆蓋已有數據,其次也要避免自己的數據過早被覆蓋(通常,MBR 的任務是載入某個程式<這個程式一 般是內核載入器,很少有直接載入內核的>到指定位置,並將控制權交給它。所謂的交控制權就是 jmp 過去而已。之後 MBR 就沒用了,被覆蓋也沒關係。過早的覆蓋指的是不被其載入的程式如內核載入器,使得內核載入器載入內核覆蓋到自己的空間)。所以我們打個比方,比如說一個操作系統如DOS1.0要求記憶體至少要32KB,MBR希望給DOS留下更多的預留空間,這也是保全自己避免自己被過早覆蓋,MBR 本身也是程式,是程式就要用到棧,棧也是在記憶體中的,MBR 雖然本身只有 512 位元組,但還要為其 所用的棧分配點空間,所以其實際所用的記憶體空間要大於 512 位元組,估計 1KB 記憶體夠用了。結合以上三點,選擇32KB中的最後1KB最為合適,那此地址是多少呢?32KB換算為十六進位為0x8000, 減去 1KB(0x400)的話,等於 0x7c00。