X86啟動過程分析

2022-04-09 20:59:18 字數 1058 閱讀 2292

一直對計算機的啟動過程不甚清楚,總是一知半解。這幾天蒐集一些這方面的資料,通過學習對啟動過程有個更深入的了解。

通常情況下,我們的系統裝在磁碟上。而cpu是不能夠直接訪問磁碟的,必須將磁碟上的內容讀入記憶體後才能被cpu訪問。那麼計算機是如何啟動並執行作業系統**的呢?這裡必定存在乙個將磁碟上的**載入到記憶體的程式,而且該程式必須能夠被cpu訪問,也就是說必須在記憶體中。為了能在每次開機時執行該**,這段**必須儲存在非揮發性(非易失性)的記憶體中,比如eprom、flash中。當按下開機鍵或重啟鍵後,cpu就會進入實模式,此時**段暫存器cs的值為0xffff,指令指標暫存器ip的值為0,所以cpu會從線性位址(此時也是實體地址)0xffff0開始執行指令,而0xffff0指向的記憶體位於eprom、flash中。因此,每次開機時cpu都會從0xffff0出開始執行一段程式,這段被稱為初始引導程式

(例如bios)。可以想象一下,如果eprom、flash的儲存空間足夠大,大到能夠放入作業系統的全部映象大話,我們完全可以在0xffff0處放入作業系統映象,這樣直接就可以進入作業系統而不用從磁碟讀入作業系統映象了。但是由於受到eprom、flash儲存空間的的限制,只能採取間接的方法了,那就是通過初始引導程式來載入磁碟上的映象。由於各種作業系統的**大小不一樣,不可能編寫乙個通用的初始引導程式來載入所有可能的作業系統映象。所以初始引導程式被設計成將磁碟第一扇區(稱為引導扇區)讀入記憶體,然後將引導扇區的開頭作為一段程式的起始位址,讓cpu轉入這段程式。這樣一來就可以使初始引導程式獨立於具體的作業系統,保證了初始引導程式的通用性,具體的作業系統只需要在磁碟的引導扇區放入相應的**即可。由於引導扇區只是乙個扇區,即512位元組,能夠容納的資訊和**有限,所以常常還需要由引導扇區的程式先裝入其他若干扇區,再由這些扇區中的程式和資料協同完成整個引導過程。

通常,我們引入乙個稱為引導裝入程式

的工具程式來輔助載入作業系統映象。我們通過引導扇區讀入引導裝入程式,然後再由引導裝入程式載入作業系統映象。常用的引導裝入程式有lilo、grub等。從功能上說,引導裝入程式和eprom中的初始引導程式並沒有什麼不同,只是體積更大,功能更為複雜。

x86的啟動過程

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

X86架構下Linux啟動過程分析

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

x86架構系統啟動過程

x86結構下作業系統啟動 計算機加電後,段暫存器cs 0xf000h,指令指標暫存器eip fff0h,在cs暫存器中隱含的乙個基址base ffff0000h,80386中實際位址是base eip ffff0000h 0000fff0h fffffff0h 在8086中最初執行的位址是pc 16...