計算機系統引導過程


從BIOS啟動到Kernel加載

大家天天使用電腦,有沒有想過整個系統是如何啟動的?從你按下電源鍵,到顯示登錄界面,中間究竟經歷了什么?

本文主要講述加載計算機內核系統的全過程,主要參考了MIT 6.828lab1實驗以及其他參考資料。某些地址、行為在不同計算機上可能不同,這里僅用JOS系統做例子,重要的是理解整個過程。

-----------------------------------內存示意--------------------------------------
    
+------------------+  <- 0x00100000 (1MB)
|     BIOS ROM     |  <- 0x000FFFF0 (BIOS起始地址)
+------------------+  <- 0x000F0000 (960KB)
|  16-bit devices, |
|  expansion ROMs  |
+------------------+  <- 0x000C0000 (768KB)
|   VGA Display    |
+------------------+  <- 0x000A0000 (640KB)
|                  |
|    Low Memory    |  <- 0x00007C00 (Boot Loader將要載入的地址)
|                  |
+------------------+  <- 0x00000000

第一步 從BIOS開始

首先,我們必須知道,程序只有加載到內存中后,才能被使用。由於某些歷史原因,計算機在開機時運行於實模式下,實模式采用16位尋址模式,最大尋址空間為1MB,即在實模式下,CPU僅能訪問到1MB的內存地址,而BIOS就被固化在這1MB中(實際會更復雜一些,BIOS存儲在可讀寫ROM中,通過硬接線到物理地址0x000f0000-0x000fffff)。

CPU硬件邏輯設計為在加電瞬間強行將CS值置為0XF000,IP為0XFFF0。該CS:IP地址正是BIOS程序的入口地址。所以,一旦接通電源,計算機將從BIOS指令開始執行

  1. BIOS首先對機器進行加電自檢(POST),目的是檢查電腦各部件是否良好,包括加載顯卡、檢查內存總量等操作。
  2. 而后,BIOS將開始初始化工作,主要是設置中斷向量表、對外部設備進行一些初始化和檢查工作。
  3. 完成一系列初始化工作后,BIOS將磁盤中的第一個扇區載入到內存中(放在 0x7c00-0x7dff 處),該扇區為引導扇區,存儲着Boot Loader程序(引導程序)。之后,BIOS使用跳轉指令到0x7c00(Boot Loader程序入口)處,將計算機的控制權交給Boot Loader程序,由其繼續進行Kernel的引導。

第二步 Boot Loader加載Kernel

在JOS中,Boot Loader包括boot.S匯編程序和main.c兩個部分

BIOS使用跳轉指令后,來到0x7c00,即boot.S的入口。

boot.S主要是將處理器從實模式轉換到 32 位的保護模式,讓CPU可以訪問到1MB以上的內存區域

  1. 首先,初始化常用寄存器
  2. 而后,打開A20地址線,讓程序可以訪問1MB以上的內存地址。
  3. 加載全局描述符表,打開保護模式
  4. 跳轉到main.c程序地址,執行bootmain函數

bootmain函數負責從硬盤中將kernel讀入到內存之中。如何讀取的呢?首先,bootmain從第一個扇區開始讀入4K數據(引導扇區一般稱為第0個扇區),該數據為ELF頭和程序頭表,保存着整個Kernel的地址、格式信息,獲得了一系列信息后,按表中數據將內核讀入到內存0x00100000中。至此內核已經被轉載至內存中。最后,bootmain函數跳轉到Kernel的入口處,將計算機控制權交給內核。


免責聲明!

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



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