講義第1頁到第5頁的說明。
課前說明作業系統(operating system)理論的教材書,與 process 和 scheduling(排程)相關的主題都是最先被討論的議題。因此,對於 Linux kernel 原始碼的研究,我們也從 process 與 scheduling 有關的部份開始講起。
Process 是執行中的程式,因此「程式如何被執行」是第一個重點,這個部份的觀念當然也包含「程式如何由儲存裝置載入」。緊接著的是,「程式載入記憶體後的佈局(layout)」,這是第二個要研究的重點。當程式被載到記憶體後,作業系統的 scheduler(排程器)便負責排程的工作與執行本文切換(context switch),這是第三個所要討論的重點。
因此,我們將會研究 Linux kernel 的 3 個「process and scheduling」議題:
1. Shell 如何載入執行檔(ELF executables)至記憶體。
2. Process 的 memory 資枓結構。
3. Linux scheduling 與 x86 context switch。
在開始進入主題前,我們先來了解一下 Linux kernel 的開機流程與 scheduler 初始化的關係。然後我們會接著討論「Process Creation」,並一併說明「 Shell 如何載入執行檔(ELF executables)至記憶體」。
編譯 Kernel 2.6 的注意事項
Kernel 2.6 的編譯必須使用 gcc 3.2 版以上,這張講義的 code 位於 init/main.c,由這段 code 也能知道,在編譯時期(compile time)就會做 gcc 版本的檢查。
Operating System Entry Pointinit/main.c:start_kernel() 是「 architecture-independent booting process」的起點(entry point),到這裡表示 kernel 的開機已經進入作業系統核心的部份(OS booting),並且完成了機器平臺(architectural)的初始化與設定工作。
用一句簡單的話來解釋:我們已經脫離 arch/ 目錄啦!start_kernel() 也被解釋為作業系統(operating system、linux kernel)的進入點。
Initialization Sequence在 main.c 裡的 start_kernel() 函數實作中,我們能看到一大串的「initialization」函數呼叫。這些初始化函數的呼叫是有順序關係的,因此是「initialization sequence」。
在整個初始化程序中,與 scheduler 有關的初始化函數說明如下。
Scheduler Initialization Sequence
我們先來說明一下這 3 個初始化函數的主要目的,再深入討論其內部實作:
1. sched_init():初始化排程器,包含:初始化 run queue、初始化 “idle thread”。
2. pidhash_init():初始化 “PID” 的 hash table。
3. fork_init():計算 kernel 能 “fork” 的最大 process 數量。
Keywords |
operating system, process, scheduling, Linux kernel, scheduler, context switch, ELF, process creation, run queue, idle thread, PID, |
跟上我們的腳步:請先行閱讀以下的文章,再看這篇日記! |
|
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw