系統初始化 上電

2021-05-23 17:23:09 字數 3098 閱讀 9927

讀核心源**是一件很有意思的事。它像一條線,把作業系統,編譯原理,組合語言,計算機組成原理,

c 語言,資料結構與演算法,計算機系統結構等等計算機的基礎課程串起來。而分析

linux

的啟動很重要,因為牽涉到硬體的初始化和核心各模組初始化環境的搭建,所以我們就針對

linux/arch/x86

下的**,對從開啟

pc電源到螢幕上出現

shell

環境,來對整個

linux

的初始化過程進行乙個全方位的分析,希望能有幫助,不足之處,還請各位網友不吝賜教。

目前,市面上的大多數計算機系統的記憶體都是「隨機性」的:一旦關機斷電,儲存在記憶體中的資訊、連同作業系統本身都會丟失。所以,必須把作業系統(核心)的程式儲存在某種永久性的介質中,使得開機加電時有乙個從不揮發介質裝入作業系統、並轉入執行的過程,這個過程就叫做「引導」

(bootload

,或boot),

也稱為「自舉」。

我們只關注

x86體系的這個過程,

cpu所在的主機板會有乙個特殊的硬體電路在

cpu的

reset

引腳上產生乙個電平。這時,

cpu處於實位址模式中,並開始自檢,自檢的最後乙個步驟是把一些暫存器(如cs和

eip)設定成固定值。我們知道,實模式下的定址方法是

16位段暫存器左移

4位加上

16位偏移構成具有能定址

1mb能力的

20位位址。所以,剛開始時,復位輸入提供一種初始化的硬體手段:標誌暫存器設為

0xuuuu0002(u

代表未定義,實模式下

9位標誌可用,這裡是奇偶標誌為

1);指令指標

eip設為

0x0000fff0,cs

暫存器設為

0xf000;ds

、ss、es

、fs和gs

暫存器都設為

0x0000

,指令佇列清空。

cpu在識別出

reset

訊號後把資料匯流排設在高阻狀態,位址線強行設為

1。由於清空中斷標誌是初始化的一部分,外部中斷被禁止。因為**段暫存器為

0xf000

,指令指標為

0x0000fff0

,位址線

a20-a31

全部是1

,從而復位後實模式程式從位址

0xfffffff0

開始(注意,只用於實模式高位址位忽略,從位址

0xffff0

開始)。該位址處可以包含一條轉移指令跳到啟動程式處。

那麼,這段程式要有多大呢?這就要看具體的設計了。在早期的計算機中這段程式般都很小,例如

2k位元組或者史小,甚至於只有幾條指令(我們的胡希明老同志回憶起

70年代中美建交後進入中國的

nova

機,由此而來的國產機名為

djs-130

,作業系統為

rtos

,引導程式只有

13條指令,當時稱初始引導

13條,亦稱手撥

13條。

13條指令執行結果是通過光電讀入機把存放在穿孔紙帶上的

rtos

執行碼裝入記憶體)。這是因為早期的

prom

或eprom

的容量都很小,並且其目的和功能也很單一。

我們在「

pc儲存器」

一篇博文中講到,

rom和

ram擴充套件成乙個整體的記憶體系統,這個

rom的位址是

32位的,況且開機時

cpu只執行在實模式下,高

12位全被置

1那麼線性位址

0xffff0

對應的實體地址就是

0xfffffff0

,定位到這個

rom。

rom中所存放的程式集在

80x86

體系中通常叫做基本輸入

/輸出系統(

basic input/output system, bios

),因為它包括幾個中斷驅動的低階過程。比如,執行

int 10h

,就是顯示服務,

10h是中斷型別號,在執行以下流程:

(sp)

←(sp) - 2

;sp - 2

((sp+1),(sp))

←(psw)

;標誌位暫存器內容進棧if←

0, tf←0

;清除中斷和陷阱標誌

(sp)

←(sp) - 2

;sp - 2

((sp+1),(sp))

←(cs);cs

入棧(sp)

←(sp) – 2

;sp - 2

((sp+1),(sp))

←(ip);ip

入棧(ip)

←(type*4)

;取中斷服務程式偏移位址,這裡的

type

是10h

(cs)

←(type*4 + 2)

;取中斷服務程式段位址,這裡的

type

是10h ……

;開始執行位於

rom的

bios

中斷服務程式

(sp)

←(sp) + 2

;sp + 2

(ip)

←((sp-1),(sp));ip

出棧(sp)

←(sp) + 2

;sp + 2

(cs)

←((sp-1),(sp));cs

出棧if

←1, tf←1

;設定中斷和陷阱標誌

(sp)

←(sp) + 2

;sp + 2

(psw)

←((sp-1),(sp))

;標誌位暫存器內容出棧

不管linux

、ms-dos

還是windows

,在啟動時,都要通過這些過程對計算機硬體裝置初始化。

linux

一旦進入了保護模式,就不再使用

bios

,而是為計算機上的每個硬體裝置提供各自的裝置驅動程式。

初始化 指定初始化

id alloc 物件的誕生過程,主要是從作業系統獲得一塊足夠大的記憶體,以存放該類的全部例項變數,並將其指定為存放記憶體物件的實力變數的位置。alloc方法同時將這塊記憶體全部設定為0。結果是 bool變數初始化為no,所有的int型別變數為0,float變數為0.0,所有的指標為nil.obje...

初始化 1 預設初始化 列表初始化

初始化的基本概念 事實 初始化和賦值是兩個完全不同的操作。初始化,是建立變數時賦予其乙個初始值。賦值,是把物件的當前值擦除,用乙個新值代替。列表初始化 p39 作為c 11新標準的一部分,用花括號 來初始化變數得到了全面應用。出於某些原因,這種初始化的方式叫做列表初始化。現在,無論是初始化物件還是某...

初始化 MyBatis初始化之載入初始化

在mybatis初始化過程中,大致會有以下幾個步驟 1.建立configuration全域性配置物件,會往typealiasregistry別名註冊中心新增mybatis需要用到的相關類,並設定預設的語言驅動類為xmllanguagedriver 3.構建defaultsqlsessionfacto...