作業系統之bios、mbr
- 系統上電之后發生了什么
- bios相關內容
- mbr相關內容
- 寫在最后
系統上電之后發生了什么
bios是每個芯片出場的每個廠家寫死在rom中的一段代碼,這段代碼在系統一開始上電之后首先運行的代碼,負責檢查電腦硬體是否存在問題,確認沒有任何問題之后,會去記憶體中找到主引導扇區mbr,將主引導扇區加載至0c7c00的地址(這一部分后面會具體解釋),mbr會負責將處于磁盤中的作業系統加載進來,然后將控制權交給作業系統,至此,控制權交給作業系統,
bios相關內容
bios的代碼是一開始便寫好的,放在rom里面,所以,cpu一開始應該找到rom中bios的地址,然后加載至cpu中進行執行,這部分是怎么實作的呢?
首先,最初的作業系統是8086系統,后面的作業系統都兼容了8086,所以在一開始的實模式下都類似于8086系統,所以接下來我們討論8086系統,
8086是16位的cpu,但是有20根地址總線,所以,采用基址+偏移量的方式尋址,使尋址空間增加到2^20,也就是1M的空間(高16位左移4位,加上低16位),
所以,一開始的rom放在哪里決定了后面的系統一開始上電的時候去哪個地址尋址,
由于不同的計算機廠商生產的計算機所帶的外設不一樣,因此,這段程式大小也限機型的不同而不一樣,如果廠商A的rom大小有1K,廠商B的rom大小有2K,那么程式員開始地址就會不一致,為了方便程式員,決定將rom的代碼放在1M的最后面,這樣程式員使用的時候就可以從0開始寫代碼,那么問題又來了,將BIOS這段程式放在1M記憶體的頂部,如果這段程式大小為1K,那么應當從0xFFC00開始放,如果這段程式的大小為2K,那 么應當從0xFF800開始放,對于CPU而言,到底是應當從0xFFC00開始執行還是應當從0xFF800開始執行呢?
為了解決這個問題,8086規 定,CPU均從0xFFFF0處開始執行,而在0xFFFF0處,放一條無條件轉移指令JMP,如果A廠的BIOS是從0xFFC00開始放的,那么這條 轉移指令就跳轉到0xFFC00處開始執行,如果B廠的BIOS是從0xFF800開始放的,那么這條轉移指令就跳轉到0xFF800處開始執行,各個廠 家可以跟據自己所生產的BIOS程式的大小,來決定此轉移指令具體跳轉到的位置,
至此,系統已經知道了上電后應該怎么做,bios在檢查完硬體之后,便開始決定加載os,
PS:我們說bios放在rom中,那為什么會影響到記憶體呢,如下圖所示:
rom和ram統一編址,一開始的的1M使包括rom的,

mbr相關內容
mbr又叫主引導扇區,使負責將os從磁盤加載至記憶體的,為什么不讓bios直接將os加載至記憶體呢?
因為在機器出廠時,不能限制磁盤去只用某種檔案系統,而BIOS不可能去識別支持所有檔案系統程式,因此為了靈活性,就通過加載程式讀OS,
mbr的大小是512個位元組,最后兩個位元組是0x55和0xAA,為什么是這兩個位元組呢?(百度到的是總要有個結束標志),這兩個位元組的作用是作為mbr的結束標志,如果沒有這兩個結束標志,cpu會認為磁盤沒有初始化,
mbr為什么是512個位元組呢,這是因為mbr里面負責加載os的二進制代碼共446個位元組,然后磁盤有4個磁區,每個磁區的資訊有64bytes,還有最后兩個位元組作為結束標志,446+64+2=512bytes
主引導扇區都干了什么?主要是負責讀寫磁盤的,先是打開保護模式,然后初始化gdt,訪問磁盤,
為什么mbr要放在0x7c00的位置?
作業系統共需要32KB的大小,它同樣是放在了末尾,
0x7ffff-512-512+1=0x7c00,另外一個512是主引導扇區本身產生的資料,
作業系統被放在了哪里?
0x100000,也就是bios1M的后面,
至此,作業系統的加載過車給已經結束,
寫在最后
本文章參考了很多文章,如果覺得被抄襲,請及時聯系我,并深感抱歉,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/208982.html
標籤:其他
上一篇:如何做好技術型銷售
下一篇:詞根詞綴前綴總結(一)
