在計算機系統加電時,執行bios啟動韌體,在cpu初始化完成之後,預設約定cs和eip的初始值(cs:**段暫存器;eip:指令指標暫存器),
由開發者手冊看出cs=f000h;eip=0000fff0,實際位址為base
+eip=ffff0000h+0000fff0h=fffffff0h這是bios的eprom所在地(base是cs中的基址)通常第一條指令是一條長跳轉指令,到bios**中執行。
此時系統處於實模式,在實模式下位址計算為pc=16*cs+ip,這是當前訪問的第一條指令位址。
實模式下位址匯流排並非32位,而是只有20位可用,可用的只有2^20,即1m空間。
為了訪問磁碟裝置,在bios中需要提供
1.基本輸入輸出的程式。(完成從磁碟上讀資料,從鍵盤上讀使用者輸入,顯示相應輸出)
2.系統設定資訊。(從硬碟,軟盤還是光碟機啟動)
3.開機後自檢程式。
4.系統自啟動程式等。
具體過程為:當bios初始化完成之後,會從磁碟上讀引導扇區(512位元組),將引導程式從引導扇區載入到0x7c00;接著跳轉到cs:ip=0000:7c00,此時把控制權轉到了從磁碟上讀進來的程式,即引導程式。
引導程式會將作業系統的**和資料從硬碟載入到記憶體中,然後跳轉到作業系統的起始位址,將控制權交給作業系統
eg:為什麼不從bios直接讀取作業系統的核心映像?(1.磁碟上檔案系統多種多樣,而bios受限於能力,不可能認識所有的檔案系統,則約定先讀取引導程式,用引導程式識別磁碟上的檔案系統,進而讀到核心映象並載入到記憶體中。2.bios受限於能力,無法用來載入多分割槽的複雜大容量os)
而在實際應用中bios並不能直接讀取bootloader,在最早的時候系統中只有乙個分割槽,可以直接找檔案系統,但現在大多數計算機中都不止有乙個分割槽,所以需在前面加乙個主引導記錄,確定從哪個檔案系統中讀引導程式,bios讀取主引導扇區**後讀取活動分割槽的引導扇區**,再讀取檔案系統的引導程式。
具體過程為:cpu加電穩定後從0xffff0讀第一條指令,第一條指令為跳轉指令(cpu初始狀態為16位實模式,cs:ip為16位暫存器),進入bios。
bios初始化時需要進行:
1.硬體自檢post
2.檢測系統中記憶體和顯示卡等關鍵部件的存在和工作狀態。
3.查詢並執行顯示卡等介面卡bios,進行裝置初始化。
4.執行系統bios,進行系統檢測,檢測和配置系統中安裝的即插即用裝置
5.更新cmos中的擴充套件系統配置資料escd(擴充套件系統配置資料)(知道當前系統中有哪些裝置)
6.按指定順序從軟盤,硬碟或光碟機啟動
讀進第一塊扇區後,主引導記錄有512位元組,但啟動**只有446位元組,用於檢查分割槽表正確性,載入並跳轉到磁碟上的引導程式;硬碟分割槽表佔64位元組,用於描述分割槽狀態和位置,每個分割槽描述資訊佔據16位元組(採用bios-mbr規範,現在大多數採用新的bios-gpt規範,可載入更多分割槽),主引導記錄結束標誌字2位元組(55aa),是主引導記錄的有效標誌。
然後跳轉到活動分割槽的引導扇區,其中包含用於跳轉到啟動**的跳轉指令(這部分是與平台相關的**),檔案捲頭:檔案系統描述資訊;啟動**:跳轉到引導程式;結束標誌依然是55aa。
引導程式在載入時也不是首先去載入核心,而是從檔案系統中先讀乙個啟動配置檔案,依據這個選擇啟動的引數,如正常啟動或在安全模式啟動,然後依據配置載入指定核心並跳轉到核心執行。
bootloader要做的事情有:
1.從實模式使能保護模式,從16位定址空間切換到32位定址空間,使能段機制。
2.從硬碟上讀取kernel in elf格式的kernel(跟在mbr後面的扇區)並放到記憶體中固定位置。
3.跳轉到os入口點執行,控制權交到os。
段機制:
使能保護模式:
然後載入elf格式的os kernel(此處**為ucore os kernel)
struct elfhdr ;
struct proghdr ;
作業系統學習筆記(二) 系統啟動流程
上一節講解系統呼叫的過程中粗略的講了一下系統啟動的流程,然而實際上系統地啟動流程遠沒有那麼簡單,本節就稍微詳細地講解一下。但是實際上即使是這一節也無法十分詳細講解,只是讓我們對系統啟動的過程有乙個整體的認識而已。首先是bios讀取引導程式的過程 系統加電後,cpu初始化,然後bios初始化硬體,然後...
Ubuntu 作業系統學習筆記之系統啟動詳解
執行引導程式 grub 載入核心 執行init runlevel bios,basic input output system,基本輸入輸出系統,存在於主機板的bios晶元上.計算機啟動首先執行bios 作用 1,硬體檢查 開機自檢 2,查詢可啟動裝置 可啟動裝置 具有引導程式,首512個位元組的最...
linux作業系統學習筆記(三)系統啟動及服務管理
啟動1.啟動bootmanager grub 2.載入系統核心,啟動init程序 init程序是系統根程序,所有系統程序都是它的子程序 3.init程序讀取 etc inittab檔案資訊,進入預設的執行級別,按順序執行具有不同優先順序的指令碼 一般 etc rcs.d 先執行,然後是其他的資料夾,...