jollen.org

Jollen 的 Blog
Jollen's email: jollen # jollen.org
more:  Jollen's Training

Jollen 的 Linux 核心分享包,#3: fork_init()《講義6》

.作者:jollen/
.日期:November 9, 2006 11:41 PM


我們知道,在 start_kernel() 的開機過程中,會呼叫許多初始化核心的常式。其中 fork_init() 是用來初始化 kernel 的"fork" 環境的。"fork()" 是用來產生 child process 的 system call,當 parent process 想要執行外部程式時,會先 fork child process,接著 child process 再利用 exec system call 自己的空間取代為外部程式。

fork_init.jpg

從講義第 5 頁開始,我們把問題做分割,找出與 Scheduling 有關的初始化流程來做研讀,因為我們想要以 Scheduling 做為深入 Linux kernel 的第一門課。

講解 fork_init()

1. Kernel 能 fork 的 process 數是依據 physical memory 的大小來決定的,我們看到 fork_init(unsigned long mempages) mempages 即是用來計算 max_threads 的參數。

2. 看到 mempages 參數,這個參數是由 start_kernel() 呼叫 fork_init() 時傳入的:

asmlinkage void __init start_kernel(void)
{
   ...
   fork_init(num_physpages);
   ...
}

3. 找一下 num_physpages,原來是 kernel 的 global symbol 啊,這個地方在 mm/memory.c

unsigned long num_physpages;
...
EXPORT_SYMBOL(num_physpages);

我們的想法是,目前還沒讀到有關 Memory Manager 與 mm 初始化的主題,所以還不如先暫時把這個地方當黑盒子,再做一次分割。因此,num_physpages 是怎麼來的就先放到「TODO」清單裡了。

4. 計算 max_threads 需要以下二個常數:

a. THREAD_SIZE:dependent on architecture

b. PAGE_SIZE:dependent on architecture

這二個常數都是平臺相依的,我把他們都標示在投影片上。這是在 processor-level 的 porting 就要處理掉的。

5. 再來,如同程式碼所述:至少要能產生 20 個 thread 系統才能開機。所以限定 max_threads 的最小值是 20。

另外,我們會發現有些與 "memory" 或 "signal" 有關的 code,目前比較好的做法是先放到「TODO」。希望我們這裡的思考邏輯與陳述方式對大家「閱讀核心」能有一點幫助。

跟上我們的腳步:請先行閱讀以下的文章,再看這篇日記!

Tags:

純手工打造說明:技術專欄文章為 Jollen 原創,內容皆為人工撰寫,無 AI 生成。轉載請註明出處與作者,並全文引用。轉載時請在文章開頭或結尾明顯處註明「本文出處:https://www.jollen.org,已取得原作者同意並授權使用。」
訂閱電子報:不定期 Jollen's Blog 精選文章隨 Moko365 電子報寄送;請透過 Moko365 電子報訂閱(可隨時取消)。

Copyright(c) 2001–2006 www.jollen.org. All rights reserved.
Last update: 2026-07-22