從開機加電到執行main函式期間,實現了核心程式到計算機記憶體的載入,從實模式到保護模式的轉變,並且開始重建保護模式下的中斷服務機制,記憶體分頁機制等前期工作,然後開始順理成章地呼叫並執行main函式。此時,系統仍處於中斷關閉模式。
二、裝置環境初始化及啟用程序0
現在開始進入main函式中執行,此時,核心程式需要對裝置環境進行初始化工作,同時,需要啟用系統的第乙個程序----程序0。
(1) 設定根裝置、硬碟;(略)
(2) 規劃物理記憶體格局,設定緩衝區、虛擬盤、主記憶體;
主機中的運算需要cpu、記憶體相互配合工作才能實現。對記憶體中緩衝區、主記憶體的設定、規劃從根本上決定了所有程序使用記憶體的數量和方式,必然會影響到程序在主機中的運算速度。具體規劃:
除核心**和資料所佔的記憶體空間之外,其餘物理記憶體主要分三部分,分別是主記憶體區、緩衝區和虛擬盤。主記憶體區是程序**執行的空間,也包括核心管理程序的資料結構;緩衝區主要作為主機與外設進行資料互動的中轉站;虛擬盤區為可選區域,如果使用虛擬區,則可以將外設上資料先複製到虛擬區,然後加以使用。
(3) 設定虛擬盤空間並初始化;(略)
(4) 記憶體管理結構mem_map初始化;
主記憶體區與緩衝區的位置及大小確定後,系統就開始對主記憶體區的管理結構進行設定。這裡值得注意的是,作業系統設計者對核心和使用者程序採用了兩套不同的內崔分頁管理方法。核心採用的分頁管理方法,線性位址和實體地址完全一樣,一一對映,等價於核心可以直接獲得實體地址;使用者程序則不是這樣,它的線性位址與實體地址往往通過mmap對映,之間沒有可遞推的邏輯關係。這樣設定的目的在於,讓使用者程序無法通過線性位址推算出具體的實體地址,但是核心可以。於是,核心可以訪問使用者程序,而使用者程序只能知道自己的程序空間,所以就不能訪問其他的使用者程序,更不能訪問核心。
(5) 異常處理類中斷服務程式掛接;(略)
(6) 初始化塊裝置請求項結構;(略)
(7) 與建立人機互動介面相關的外設的中斷服務程式掛接;(略)
(8) 開機啟動時間設定;(略)
(9) 初始化程序0;
程序0是linux作業系統中執行的第乙個程序,也是linux作業系統父子程序建立機制的第乙個父程序,因此,程序0須具備以下三種能力:
1) 將程序0的task_struct結構中ldt、tss與gdt掛接,並對gdt、程排程相關的暫存器等作初始化設定;
2) 具備參與多程序輪詢能力,即支援多程序輪流執行(系統在這裡對時鐘中斷進行設定);
3) 具備處理系統呼叫的能力,通過set_system_gate將system_call與idt相掛接;
首先,程序0的task_struct是由作業系統設計者事先設計好的,即init_task巨集,並用其指標初始化task[0]項,將其餘項清零操作。初始化程序0的最後一步,將ldtr與tr暫存器分別指向ldt0、tss0,cpu即能夠獲得一切與程序0相關的管理資訊;然後,設定時鐘中斷,掛接時鐘中斷服務程式,再將開啟與時鐘中斷相關的遮蔽碼;最後,設定系統呼叫總入口,所有使用者程式使用系統呼叫,產生軟中斷後,作業系統均通過此入口找到具體的系統呼叫函式。
(10) 初始化緩衝區管理結構;
緩衝區是記憶體與外設進行資料互動的媒介。記憶體與硬碟最大的區別在於,硬碟僅僅是對資料資訊以很低的成本做大量資料的端點儲存,不參與運算;而記憶體除了需要對資料進行儲存之外,更重要的是要與cpu、匯流排配合進行資料運算。緩衝區介於兩者之間,它既對資料資訊進行儲存,也能夠參與一些像查詢、組織之類的間接、輔助性運算。也因為有了緩衝區,硬碟與記憶體均只需考慮與緩衝區進行資料互動,兩者的組織、管理與協調由作業系統統一操作。
作業系統通過hash_table[nr_hash]、
buffer_head雙向迴圈鍊錶組成的複雜雜湊表管理緩衝區。每乙個buffer_head對應一塊緩衝塊,結構示意圖如下:
(11) 初始化軟、硬碟;(略)
(12) 開啟中
斷;到這一步,系統中所有中斷服務程式都已經和idt正常掛接,即意味著中斷服務體系構建完畢,系統可以在32位保護模式下處理中斷,重要意義之一是可使用系統呼叫。
(13) 翻轉特權級,成為真正的程序;
linux作業系統規定,除程序0外,所有程序都要由乙個已有程序在3特權級下建立。而以上所有的流程操作,程序0的**和資料都是由作業系統設計者寫在核心**、資料區,並且處於0特權級,此時,程序0還不是嚴格意義上的程序。
因此,程序0需要轉變特權級,這裡是通過模仿中斷返回動作的方法。cpu從接收到中斷請求,到從中斷服務程式返回期間,做了兩件事:
1) 硬體保護現場和恢復現場; 2) 翻轉特權級;
這裡,模仿中斷和筆記(一)中跳轉main函式的方式一樣,由程式設計師事先模仿壓棧順序手工進行壓棧,並出棧。
至此,程序0正式啟用,成為名副其實的程序,並開始建立程序1。
linux 核心設計與實現(第二章筆記)
最近開始學習linux 核心相關的知識,一直想對linux核心做些了解,但是時間上的問題,雖然學習了三年的linux,也玩了幾乎四年的linux系統,但是從來沒有對linux 核心做乙個詳細的了解,最近抽出課餘時間對 linux核心設計與實現 進行了第一遍閱讀,相關的筆記如下,如果覺得不錯會做第二遍...
Linux核心設計的藝術 前三章總結
特權級變化的本質是,cs,ds,es,fs,gs,ss的不同,特權級0從gdt中取得描述符,前面這些暫存器後3位為000,描述符特權級為00,特權級3從ldt中取得描述符,前面這些暫存器後3位為111,描述符特權級為11。中斷int 0x80從特權級3進入特權級0,並把資訊儲存在特權級0的堆疊中,i...
Linux核心list head學習筆記(二)
注 這個list.h 是為了配合示例程式而建的,內容來自 linux include linux list.h 和相關檔案 ifndef linux list h define linux list h struct list head define list head init name defi...