# 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 (含) 之前
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.