Linux開機啟動流程之一BIOS


一、前置知識:

  1)硬件中斷處理

    BIOS的服務功能是通過調用中斷服務程序來實現的,根據服務類型不同分為很多組,每組都有專門的中斷號。比如顯示服務,中斷號為10H;屏幕打印,中斷號為05H;串口服務,中斷號為14H等等。每組又可根據功能細分為不同的服務號,比如顯示服務(INT 10H),當功能為00H(AH=00H)表示設置顯示器模式,當功能為01H(AH=01H)表示設置光標形狀等等。

  INT 13H主要用於對硬件磁盤進行操作。

  INT 19H主要用於將MBR加載到內存0x7c00。

  2)程序計數器

    存放下一條指令所在單元的地址

  3)硬件標識

    硬件以地址的形式存儲在內存RAM中

二、BIOS工作原理

  第一階段:開機加電階段

  按下開機按鈕的時候,電源向計算機主板以及其它硬件設備供電。剛開始電壓不穩定,計算機主控芯片會不斷的向CPU發送RESET信號,試圖讓CPU自動恢復初始狀態,當主控芯片檢測到穩定電壓后:1)撤銷RESET信號的發送;2)程序計數器初始化為FFFF:0H。CPU開始執行該處(FFFF:0H)指令(jmp start)

  

   第二階段:POST(Power-on Self Test)階段,即開機自檢階段

  系統BIOS啟動后,進行一些列硬件檢測與初始化操作:顯卡、CPU、內存以及標准硬件設備。

  第三階段:其它設備的檢測與更新,以及CPU控制權轉交

  BIOS通過INT 19H中斷程序將啟動盤第一扇區MBR加載到RAM(0x00007C00),同時CPU程序計數器設置為0x00007C00H,開始執行MBR。

 

答疑:為何BIOS將MBR讀入0x7C00地址處?0x7C00這個地址來自Inter的第一代個人電腦芯片8088,以后的CPU考慮到兼容性,一直保留使用這個地址。

    1981年8月,IBM公司生產了世界上第一台個人電腦PC5150,至此它就是現代x86個人電腦兼容機的祖先,其中0x7c00就出現在這個電腦的ROM BIOS的INT 19H中斷處理程序中。個人計算機肯定要運行操作系統,在這台計算機上,運行的操作系統是DOS 1.0,此系統要求的最小內存為32K,所以此版本BIOS也是按照最小內存32KB研發的。

    在操作系統被加載后,內存布局如下:

 +---------------------------------------0x0

 | Interrupts vectors(中斷向量表)

   +---------------------------------------0x400

   | BIOS data area(BIOS的數據區域)

   +---------------------------------------0x5??

   | OS load area(操作系統加載區域)

   +---------------------------------------0x7C00

   | Boot sector(引導區域)

   +---------------------------------------0x7E00

   | Boot data/stack(引導數據/堆棧)

   +---------------------------------------0x7FFF

   | (not used)

   +---------------------------------------(....)

   

   當時,搭配的操作系統是86-DOS,這個操作系統需要的內存最少是32KB,內存地址從0x0000開始編號,32KB的內存就是0x0000~0x7FFF,其中8086芯片本身需要占用0x0000~0x03FF,用來保存各種終端處理程序的存儲地址,比如主引導記錄本身就是中斷信號INT 19H的處理程序,因此僅剩下0x0400~0x7FFF地址空間可以使用。

   為了把盡量多的連續內存留給操作系統,主引導記錄就被放到了內存地址的尾部。由於一個扇區是512字節,主引導記錄本身也會產生數據,需要另外留出512字節保存,所以,它的預留位置變成了

 0x7FFF - 512 - 512 + 1 = 0x7C00

 最終0x7C00地址一直沿用至今...


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM