2013年1月20日 星期日

預計在 2013/01/26 mosut 分享: fork 的實作

cpu: intel x86

fork_ex.c
 1 void init(void)
 2 {
 3   int pid = fork();
 4   int a=5;
 5 
 6   if (pid != 0) // parent
 7   {
 8     while(1)
 9     {
10       *((u8*)0xb8000+160) = 'P';
11       *((u8*)0xb8000+160+1) = 0x94;
12       *((u8*)0xb8000+160+2) = 'a';
13       *((u8*)0xb8000+160+3) = 0x94;
14       *((u8*)0xb8000+160+4) = 'r';
15       *((u8*)0xb8000+160+5) = 0x94;
16     }
17   }
18   else // child
19   {
20     app_print("I am child");
21     while(1);
22   }
23 }

系統程式員多少會接觸 fork; fork 調用呼叫一次, 卻會 return 兩次。傳回值一次是 0, 一次是非 0, 真是神奇, 這是怎麼做到的? 你可以寫一個類似 fork 行為的 function 嗎?

fork 出來的那個 process 從哪裡開始執行呢?
L3?

如果你對這些問題有興趣, 歡迎來聽聽看 "fork 的實作"這個主題。沒有簡報, 只有生硬的程式碼。這個實作版本是 Orange's 一個作業系統的實現這本書的版本, 以 micro kernel 的架構實作, 我做了一些簡化的動作。我將使用 gdb/qemu, 和大家一起來逐步追蹤 fork 的實作, 觀察被 fork 出來的 process 行為。讓我們穿梭在 process 之間, 體會 os 之美。

延伸閱讀:



共筆分享: http://openetherpad.org/mosut20130126

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。