撰寫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,
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/497677.html
標籤:其他
上一篇:MariaDB的安裝與配置
下一篇:Jenkins之Maven的配置
