第4章 系統初始化

2021-07-05 01:21:58 字數 1722 閱讀 3459

(1)cpu自身初始化

cpu自身的初始化是引導過程的第一步,如果有多個cpu,即多處理器系統,則每個cpu都要進行自身初始化。

比如,對於雙處理器的pentium系統,乙個cpu總是為主,另外乙個cpu總是為輔,主cpu執行引導過程的剩餘工作,隨後核心才會啟用輔cpu。

在輔cpu被啟用之前,我們可以認為該體統中只有乙個cpu可用,而不必考慮另外乙個cpu。

接下來,cpu從某個固定位置(一般是0xfffffff0)取得指令並執行。該指令為跳轉指令,跳轉到bios**的首部。注意,cpu並不真正關心bios是否存在,

它只是執行該位址中儲存的任何指令。

(2)bios

self  test);載入核心引導程式。

post階段完成系統硬體的檢測,包括記憶體檢測、系統匯流排檢測等。bios在post階段依據內建的規則,或者使用者的手工選擇確定啟動裝置。

post完成之後,bios讀取啟動裝置第乙個扇區,即首512位元組的資訊,該扇區又被稱之為主引導記錄。mbr中儲存了核心引導程式的開始部分,bios將

其載入到記憶體並執行。

載入記憶體引導程式之後,post部分的**會被從記憶體中清理出來,但仍然會有部分的執行時服務保留在記憶體之中,供目標作業系統使用。

(3)核心引導程式

核心引導程式分為兩個階段:mbr中的主引導程式;活動分割槽引導記錄中的次引導程式。

(4)核心

核心映像被載入到記憶體並獲得控制器之後,核心階段開始工作。通常,核心映像以壓縮形式儲存,並不是乙個可執行的核心。因此,核心階段的首要工作

是自解壓核心映像。

start_kernel函式

reset_init函式

kernel_init函式

init_post函式

當核心被引導並進行初始化之後,核心啟動了自己的第乙個使用者空間應用程式,即init。這是呼叫的第乙個使用標準c庫編譯的程式,其程序編號始終為1.

init負責觸發其他必須的程序,以使系統進入整體可用的狀態。init的這些工作根據/etc/inittab檔案來完成,包括設定getty程序接受使用者登入,設定鍵盤、

字圖,設定網路等。如果沒有init觸發這些程序,核心即使成功啟動,也沒有多大意義。

基於這種設計模式,init程序是系統中所有程序的起源,init程序產生getty程序,getty程序產生login程序,login程序又進而產生shell程序,然後我們使用

shell。就可以產生每乙個需要執行的程序。

核心選項;註冊核心選項

do_initcalls()函式

do_initcall函式通過for迴圈,由_initcall_start開始,直到_initcall_end結束,依次呼叫識別到的初始化函式。而位於_install_start和_initcall_end之間

的區域組成了.initcall.init節,其中儲存了由***_initcall形式的巨集標記的函式位址,do_initcall函式可以很輕鬆地取得函式位址並執行其指向的函式。

.initcall.init節所儲存的函式位址有一定的優先順序,越前面的函式優先順序越高,也會比位於後面的函式先被呼叫。

由do_initcalls函式呼叫的函式不應該改變其優先順序狀態和禁止中斷。因此,每個函式執行後,do_initcalls會檢查該函式是否做了任何變化,如果有必要,

它會校正優先順序和中斷狀態。

另外,這些被執行的函式又可以完成一些需要非同步執行的任務,flush_schedule_work函式則用於確保do_initcalls函式在返回前等待這些非同步任務結束。

第1章 專案初始化

ok,現在假定你已經安裝好了git。怎麼驗證呢?在你的命令列工具中輸入 git version來呼叫一下它,檢視軟體的版本號類似於學習程式語言的輸出 hello world 那麼重要,如果它有類似於以下的回應則說明安裝成功了。如果系統回覆git命令無法找到的話,那我只能說 繼續努力安裝吧孩子。柏拉圖...

第6章 初始化與清除

用建構函式確保初始化 在乙個物件被定義時 x a 這時就好像a 是乙個int 一樣 為這個物件分配記憶體。但是當程式執行到 a的序列點執行的點時,建構函式自動被呼叫,因為編譯器已悄悄地在 a的定義點處插入了乙個 x x 的呼叫。就像其他成員函式被呼叫一樣。傳遞到建構函式的第乙個 秘密 引數是 thi...

初始化 指定初始化

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