# F09: daemon :::info 主講人: [jserv](http://wiki.csie.ncku.edu.tw/User/jserv) / 課程討論區: [2019 年系統軟體課程](https://www.facebook.com/groups/system.software2019/) :mega: 返回「[Linux 核心設計](http://wiki.csie.ncku.edu.tw/linux/schedule)」課程進度表 ::: ## 預期目標 * 開發 non-trivial Linux kernel module * 學習 Linux 核心的 kernel thread 處理機制 * 預習電腦網路原理 ## 電腦網路概論 預習 [CS:APP 第 11 章](https://hackmd.io/s/ByPlLNaTG): Network Programming,搭配閱讀: * [nstack 開發紀錄 (1)](https://hackmd.io/s/ryfvFmZ0f) * [nstack 開發紀錄 (2)](https://hackmd.io/s/r1PUn3KGV) ## kecho * 完全運作在 Linux 核心模式的 echo server * 不到 200 行 C 原始程式碼 * 示範 [kthread 的使用](http://www.cs.fsu.edu/~cop4610t/lectures/project2/kthreads/kthreads.pdf) ```shell $ ps -ef | grep fastecho ``` 許多 Linux 裝置驅動程式或子系統會透過 kernel threads(簡稱`kthread`),讓 kthread 在背景執行提供特定服務,然後等待 events 發生。等待的過程中,kthread 會進入 sleep 狀態,當 events 發生時,kthread 會被喚醒執行一些耗時的工作,如此一來,可防止 main thread 被 blocked。 下方命令可查閱系統上的 kthread: ```shell $ ps -ef ``` 預期可見: ``` root 2 0 0 Feb17 ? 00:00:01 [kthreadd] ``` PPID 為 `2` 的都屬於 kthread,而 `$ ps auxf` 可見樹狀結構。 取得 [kecho 程式碼](https://github.com/sysprog21/kecho)並編譯: ```shell $ git clone https://github.com/sysprog21/kecho $ cd kecho $ make ``` 預期可見到檔案 `fastecho.ko` 的產生,接著可測試: ```shell $ sudo insmod fastecho.ko $ telnet localhost 12345 ``` 會出現以下輸出: ``` Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. ``` 可輸入任何字元 (記得按下 Enter),然後就會看到 telnet 回應你剛才輸入的字元。 按下 `Ctrl` 和 `]` 組合鍵,之後按下 `q`,即可離開 telnet 畫面。接著可以試著在 `$ telnet localhost 12345` 時不要輸入任何字元,只是等待,會看到以下的 kernel 訊息 (可用 `$ dmesg` 觀察): ``` cope le: 4404 kB RssShmem: 0 kB VmData: 880 kB VmStk: 132 kB VmExe: 136 kB VmLib: 6336 kB VmPTE: 212 kB VmSwap: 0 kB HugetlbPages: 0 kB CoreDumping: 0 Threads: 1 SigQ: 0/31543 ``` 尋找剛才載入的 kecho 核心模組: ```shell $ ps -ef | grep fastecho ``` 預期可見以下: ``` root 18147 2 0 14:13 ? 00:00:00 [fastecho] ``` ## KernelHTTP 參見 [Kernel HTTPd](https://paper.dropbox.com/doc/Kernel-HTTP--AbVuMmS_1IXB9OFPxLvNOsdDAQ-3WwKZiKh6TAMkIOgRtG8Y) ## 作業要求 1. 指出 [kecho 程式碼](https://github.com/sysprog21/kecho) 實作的缺失 (注意像是 buffer overflow 一類的問題),並在你 fork 出來的 repository 中予以改進 * Linux 核心版本至少為 `4.15`, 可嘗試熱騰騰的 `linux-5.1` * 留意 kernel API 的變更 3. 參閱相關材料,設計足以驗證 `kecho` 效能的實驗,過程中留意到 concurrency; 4. 在 `kecho` 的程式碼基礎上,引入 [Concurrency Managed Workqueue (cmwq)](https://www.kernel.org/doc/html/v4.15/core-api/workqueue.html),配合 (2) 的實驗,提出效能改善計畫和落實; 5. 研究上述 KernelHTTP,整合到 `kecho` 目錄中,以另外一個 Linux 核心模組或者共用程式碼的方式存在,比照 [Kernel HTTPd](https://paper.dropbox.com/doc/Kernel-HTTP--AbVuMmS_1IXB9OFPxLvNOsdDAQ-3WwKZiKh6TAMkIOgRtG8Y) 共筆的實驗,檢驗效能和正確性; ## 繳交方式 編輯 [Homework5 作業區共筆](https://hackmd.io/s/SkLygcAiV),將你的觀察、上述要求的解說和改善過程,紀錄於新建立的共筆 ## 截止日期 May 13, 2019 (含) 之前