x86架構系統啟動過程

2021-08-03 00:10:53 字數 2405 閱讀 2831

x86結構下作業系統啟動:

計算機加電後,**段暫存器cs=0xf000h,指令指標暫存器eip=fff0h,在cs暫存器中隱含的乙個基址base=ffff0000h,80386中實際位址是base+eip=ffff0000h+0000fff0h=fffffff0h(在8086中最初執行的位址是pc=16×cs+ip,其實在gdb下除錯ffffffff0h位址下的命令和ffff0位址處的命令相同,可能這就是8086架構的相容),這是bios的eprom所在地(唯讀),從該位址中讀取第一條指令,一般為長跳轉指令,跳轉到真正的bios中去執行即跳轉到可以被訪問的1m的記憶體空間中(在實模式下只能訪問1m空間)。在實模式下定址為pc=16×cs+ip。bios先做初始化工作(初始化底層硬體),然後載入儲存裝置(硬碟,光碟,優盤)上的第乙個扇區(主引導扇區)的512位元組到記憶體的0x7c00,cpu執行0x7c00的指令開始執行,也就是bootloader。

bootloader要做的事情是:(1)使能保護模式(protection mode)&段機制(segment-level protection等初始化)。(2)從硬碟上讀取kernel in elf格式的ucore kernel(跟在mbr–引導扇區後面的扇區),並放到記憶體中固定的位置,(3)跳轉到ucore os的入口點(entry point)執行,控制權交給ucore os

即執行的第一條指令也在這裡:

(0) [0xfffffff0] f000:fff0 (unk. ctxt): jmp far f000:e05b ; ea5be000f0

跳轉到真正bios程式的入口位址

這裡做很精妙,因為intel考慮到相容性問題設定了cpu加電後cs:ip=0xf000:0xfff0: 如果是i8086那麼該跳轉指令將在16位cpu可定址最大空間1mb(基本記憶體)的最後16byte,如果是i80386則將在32位cpu可定址最大空間4gb的最後16byte。

注:通過cs:ip可以發現第一條指令是在0xf000:0xfff0 執行的. 如果唯讀過大學那些涉及皮毛的書你肯定會認為其實體地址就是0xffff0 (0xf000<<4+0xfff0)。但這樣的認識僅僅是針對i8086 ,真正的x86 架構即i80386 之後是這樣的:cpu剛剛設定cs:0xf000的時候其實並不是像課本上說的那樣在實模式下。此時的實體地址需要根據cs中的隱藏暫存器dl=0x0000ffff, dh=0xff009bff中去查。這個其實就是段描述符(至少在保護模式下是,這裡也暫時這樣稱呼吧) dh的最高8位和最低8位以及dl的高16位組成了32位段基址:0xffff0000 再加上ip:0xfff0 那麼實體地址就是0xfffffff0 正好是4gb空間的最後16byte。

執行第一條指令後ljmp f000:e05b:程式跳轉到0xfe05b處,正式執行bios,然後bios中經過一系列設定,包括:基本的輸入輸出的程式,系統設定資訊,開機後自檢程式,系統自啟動程式等。

然後,bios將引導程式(bootloader)從磁碟的引導扇區(512位元組)載入到記憶體(cs=0:eip=0x7c00)處。最後bootloader將作業系統的**和資料從磁碟中載入到記憶體中。跳轉到作業系統的起始位址。

磁碟的引導扇區(512位元組):主引導記錄mbr格式包括:啟動**(446位元組)作用—檢查分割槽表正確性,載入並跳轉到磁碟上的引導程式;硬碟分割槽表(64位元組)作用:描述分割槽狀態和位置,每個分割槽描述資訊佔據16位元組;結束標誌(2位元組)–55aa(主引導記錄的有效標誌)

分割槽引導扇區(pbr或dbr):通過主引導記錄跳轉到分割槽引導扇區包括:跳轉**—跳轉到啟動**;檔案捲頭—-檔案系統描述資訊;啟動**—跳轉到引導程式(bootloader);結束標誌(55aa)

注:通常,我們將包含mbr引導**的扇區稱為主引導扇區。因這一扇區中,引導**占有絕大部分的空間,故而將習慣將該扇區稱為mbr扇區(簡稱mbr)。由於這一扇區承擔有不同於磁碟上其他普通儲存空間的特殊管理職能,作為管理整個磁碟空間的乙個特殊空間,它不屬於磁碟上的任何分割槽,因而分割槽空間內的格式化命令不能清除主引導記錄的任何資訊。硬碟的引導記錄(mbr)是不屬於任何乙個作業系統,也不能用作業系統提供的磁碟操作命令來讀取它。但我們可以用rom-bios中提供的int13h的2號功能來讀出該扇區的內容,也可用軟體工具norton8.0中的diskedit.exe來讀取。pbr是各個分割槽自己的引導記錄,又稱分割槽引導記錄,它是由format高階格式化命令寫在各個分割槽開始處第乙個扇區(比如說:主分割槽c:從1磁頭0柱面1扇區=邏輯1扇區=絕對63扇區)開始,

我們知道硬碟mbr負責總管硬碟分割槽,只有分割槽工具才能對它進行讀寫;而pbr則負責管理某個具體的分割槽,它是用作業系統的高階格式化命令來寫入硬碟的。在系統啟動時,最先讀取的硬碟資訊是mbr,然後由mbr內的主引導程式讀出pbr,最後才由pbr內的dos引導**讀取作業系統的引導程式,其中任何乙個環節出了問題,作業系統都無法正常啟動成功,如果是mbr部分出了問題,即使只是」55aa」標誌字丟失或被改為其他值,通常都會出現」無效分割槽表」、邏輯盤丟失、啟動宕機等現象;而如果是pbr部分出了問題,通常會出現」未格式化的分割槽」的錯誤提示。

X86架構下Linux啟動過程分析

1 x86架構下的從開機到 start kernel 啟動的總體過程 這個過程簡要概述為 開機 bios grub lilo linux kernel 其執行的流程圖和重要函式如下圖所示 2 載入 linux 核心 基於 x86 的記憶體布局圖 0a0000 reserved for bios do...

X86啟動過程分析

一直對計算機的啟動過程不甚清楚,總是一知半解。這幾天蒐集一些這方面的資料,通過學習對啟動過程有個更深入的了解。通常情況下,我們的系統裝在磁碟上。而cpu是不能夠直接訪問磁碟的,必須將磁碟上的內容讀入記憶體後才能被cpu訪問。那麼計算機是如何啟動並執行作業系統 的呢?這裡必定存在乙個將磁碟上的 載入到...

x86的啟動過程

1.上電,首先執行ljmp 0xf000,0xe05b 即位址0xffff0,調轉到bios,開始 執行bios bios負責pci,顯示卡之類裝置的初始化,並把可啟動裝置 軟盤,硬碟,光碟 的引導扇區boot loader 第乙個sector 拷貝到記憶體位址 0x7c00 0x7dff 之間,最...