搜尋此網誌

網頁

2010年3月22日 星期一

閱讀 Linux kernel driver 程式碼

1. busmouse.c http://lxr.linux.no/linux-old+v2.4.31/drivers/char/busmouse.c
學習driver程式碼的架構 ,觀察其中的multi-thread的機制如何實做。

2. read & write system call
user space 的 process 分配到的記憶體有可能被swapping out,因此kernel space 的 含式在存取到userspace時必須要 能先做檢查動作,以免出現 Page Fault 問題。

3. OS 只會對user space process 進行排程,且kernel space 存取invalid page 並不像USER space process 一樣(swap in),而會出現kernel panic,須視執行當下的記憶體配置,所以在寫作kernel space code 時必須很小心記憶體的使用。

4. user space 與 kenel space 的記憶體空間配置是各自獨立的 (猜測)

5. 使用到kmalloc()與copy_from_user()/ copy_to_user()等存取到user space 的含數的驅動程式必須是reentrance(spinllock 與 semaphonme) 。

6. 函數重複進入 => 該函數還未return前,又被呼叫一次。

7. 區域變數在每次呼叫都會有一塊獨立的stack來存放,而全域變數是存放於?

8. 由於user space process 會去sleep故driver function 必須是可重複進入函數

9. 使用strace工具來觀察system call的調用過程。

10. 有關process的詳細介紹:http://www.jollen.org/blog/2007/01/process_creation_2.html

11. process 對應一個PCB 其中 有一個欄位Program Counter負責紀錄該Process 執行到哪一行

12. 假若硬體ready,並不會馬上讓資料寫入硬體,而是必須等待running中的程序把時間用完且使用該driver的應用層process被系統挑到才會寫入硬體,因此當系統中的程序越多相對系統的I/O 效能就越差。

13. sleep 的process 必須先改為ready 再由系統排程進入runnning

14. 介紹MultiTasking 概念:http://www.netrino.com/Embedded-Systems/How-To/RTOS-Preemption-Multitasking

15. 將Process 由 waiting state 到 running state 是由driver來負責,硬體ready之會產生中斷(有些硬體不會產生中斷),driver 中的interrupt handler 會將process state 改為ready state。

16. (char *)kmalloc(64, GFP_KERNEL); 左式程式碼中當系統一時要不到記憶體,會讓current process 去sleep,直到記憶體被swap in 後再將 waiting process 的狀態改成runnning state.

沒有留言:

張貼留言