# 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 (含) 之前