1. 在kernel space 下呼叫schedule()時,排程器會先去檢查current process是否時間已經用完,決定是否進行context switch 或讓current process把時間用完再執行 context switch.
2. kernel timer , tasklet , task queues.
3. waitqueue 對實做 blocking I/O 有用處,讓current process 可以被rescheduling。
4. interruptible_sleep_on(&cdata->write_q) => 將current process放入自己所宣告的waitqueue 中,並將process 的狀態改成waiting state , 且能隨時收到SIGNAL(可以使用 kill 命令)。
5. 當timer function 執行完成之後,程式會直接跳至timer function 執行前的地方繼續執行 (猜測)
6. schduling 概念介紹: http://www.jollen.org/blog/2008/12/kernel-scheduling-concept-1.html
7. 每一次open需包含一個wait queue 於私有資料結構(避免WAKE UP效率很差)。
8. Ex:cdata-0.2.1中 cdata_interrupt handler負責處理process 的wake up,當ap 執行open時,會去初始化timer_frunction(每5秒執行)與cdata_interrupt_handler(每毫秒執行),可以調整cdata_interrupt_handler的執行周期,觀察系統的行為差異。
9. driver 範例: http://lxr.linux.no/linux-old+v2.4.31/drivers/char/scan_keyb.c
10. kernel timer 用於不需排程機制的應用, EX: 機器人走路。
11. 練習七的架構可以應用於: 按下按鈕5秒鐘(kernel timer poling 50次檢察案件是否被按),開發版自動重開機。
12. timer function中不能實做排程!!! ,因為timer function是在中斷模式下執行,會造成當機,所以timer functon沒有重複進入的問題。
13. 中斷模式下執行的程式與呼叫System call的程式差異:
(1). 是在一般process的context(PCB <--紀錄process狀態)外執行 (2). 不能直接存取user space (因為copy_to_user 必須透過PCB才能存取),須先將Data放置於kernel中buffer ,process再透過read/write去存取。 (3). 不能做call schedule() => 不能使用wait queue,中斷模式下做concurrent access 必須用spin lock 不能用down/up。
14. request IRQ基本觀念: http://www.jollen.org/blog/2008/03/interrupt_handling_1.html
15. 驅動程式的中斷處理 #2 (包含Counting semaphore觀念介紹): http://www.jollen.org/blog/2008/03/interrupt_handling_semaphore.html
16. Buttom Half 的觀念: http://www.jollen.org/blog/2008/03/interrupt_handling_bottom_half.html
17. Blocking I/O 觀念總結: http://www.jollen.org/blog/2008/08/linux_device_driver_blocking_io.html
18. 中斷模式下kmalloc(64,GFP_ATOMIC)才被允許使用,有關中斷模式下的限制參考講義(二)P3~P11。
19. interrupt handler 實作須盡量減少所需之I/O時間(使用tasklet機制將一些operation做排程移到OS time下去執行),以免造成系統反應時間過長的問題出現,也避免掉中斷遺失的問題出現。
20. interrupt handler 可以分為top-half 與 bottom-half 兩種,差別在於bottom-half執行時所有中斷都是開啟的,且bottom-half是由top-half做排程,在OS 時間執行。
21. top-half 與 bottom-half中的程式由工程師自行取捨並無重要工作一定得分配給誰的問題。
22. 在top-half中會將硬體最新的狀態儲存於特定的buffer中,而bottom-half則由於過了一段時間後才執行,所存的硬體狀態資訊是舊的。
23. void my_tasklet_function(unsigned int)
DECLARE_TASKLET(my_tasklet,my_tasklet_function,(unsigned int)&my_data) <= 宣告Tasklet tasklet_schedule(&my_tasklet) <= 排程bottom-half ,可以重複schedule 24. 由bottom-half 負責將user-space process 叫醒 ,top-half 負責接收中斷與排程 bottom-half。 25. 若top-half同時排程兩個以上的bottom-half,邏輯上有機會concurrent 執行 <=使用spin-lock保護。 26. 講義(二) p.24 的鍵盤範例,可以同時記錄多個被按下的按鈕,學習該機制的設計方式,可以應用於中斷快速產生的狀況。 27. 效能調教時,會衡量interrupt handler 的處理效率,並計算花費的時間。 28. 組合鍵應用 ctrl + c,須使用kernel timer 紀錄下一個被按下的按鍵使否為 c。 29. 兩種framebuffer機制: (1) ap將圖片放入buffer中(已完成mapping ),再由driver透過memcopy_fromio(dest,source,num)將圖片寫入framebuffer <=目的為了進行影像處理 (2) ap直接存取framebuffer。
30. chache 中的資料並不會被swap out 且其中的資料不會消失,且kernel本身即是個大chache。
31. vmalloc()可以指定任意大小的記憶體空間,而kmalloc則只能指定到128kb <=無法存放一張圖片。
32. 記憶體位址的mapping table一般為MMU負責做分配,若無MMU則需實作軟體去做計算,但效能會變慢,透過直接修改kernel的方式可以直接跳過mapping動作,達到phsical address連續而快速的效果。
33. ioremap()與 vmalloc()均能劃分到任意大小的記憶體空間,且存取到的一定是建構於MMU系統的虛擬空間上。
34. 無MMU的系統由於需要軟體運算page table因此效能比較差。
35. virtual address 一定是連續的,由MMU系統負責處理。
36. 記憶體空間是由kernel由低位址開始使用
37. I/O MEM 由於是外部記憶體,因此相較於RAM為連續的位址分配 (還未確定)。
38. VMA 與 VFS 的關係:
39. vmalloc 的分配只有前4Mb的Page為連續,之後則不一定連續,cdata-lcd.c 中的do_lcd_mmap()做法是由於在I/O MEM的Page range所以才能連續做mapping,要注意這點。
40. vm_area_struct 結構為kernel準備好的結構。
41. 一個基本可開機的OS需要: (1) 排程/ Context switch (2) interrupt handler (3) virtual memory
沒有留言:
張貼留言