BIOS
以intel8086為例,8086有20根地址線。一共可以訪問到0x00000 - 0xFFFFF的地址空間,剛好1MB范圍,但并未全部用于訪問DRAM。其中大部分用于訪問DRAM,一小部分用于訪問只讀存儲器ROM(那里固化了開機時需要執行的指令。)和外圍的板卡。如圖所示:
8086加電或者復位時,CS = 0XFFFF,IP = 0X0000,所以第一條指令位于物理地址0xFFFF0正好位于ROM中,一般是一個跳轉指令,跳轉到ROM低端區域。ROM內容包括很多部分,主要進行硬件的診斷,檢測和初始化。當它完成自己工作后,最后要做的就是從輔存中讀取指令數據(內核自舉代碼),然后轉到那里執行。
主引導扇區
接上文,BIOS要從輔存中加載指令數據,然后再跳轉到那里加載的地址,執行指令。這里輔存以硬盤為例,硬盤的第一個扇區稱之為主引導扇區,BIOS將把該扇區的內容加載到0X0000:0X7C00,即物理地址:0x07C00。然后判斷該扇區是否有效,有效的主引導扇區最后的2字節內容是0x55和0xAA。如果有效就會使用jmp指令跳轉至0x07C00。主引導扇區里面應該是內核自舉的代碼指令。然后內核接管一切,完成后續操作。
這里也有點意思,想像一下,我們的程序執行一定需要操作系統(內核)嗎?不一定,假設主引導扇區內容不是內核,而是一段小程序。只要最后2字節數據是0x55和0xAA,那么這段程序依然能運行。所以程序使能夠脫離操作系統(內核)而執行的。這也從另一個側面說明了為什么操作系統會被發明出來。
顯卡和顯存
順帶說下顯示的東西。
- 圖形模式
顯卡有自己的存儲即顯存,顯存里面放的二進制數據,比如第1個字節對應屏幕左上角連續的8個像素,第二個字節對應后續的8個像素,以此類推。(1個二進制位對應像素的亮暗)。- - 文本模式
與之對應的還有中方式是:顯存里第一字節存放字符編碼(ACISS),第二字節存放編碼控制字符顯示樣式。以此類推。
為了顯示數據,CPU需要訪問顯存,但顯存位于顯卡上,訪問顯存則需要和顯卡設備打交道,這樣總會影響速度和效率。于是后來就決定把顯存也映射至處理器可以直接訪問的地址空間。傳統上,0xB8000 ~ 0xBFFFF時留給顯卡的。這樣就可以直接用mov指令直接寫數據。當我們把字符寫在這一塊時,屏幕上就會顯示出我們想要的內容。