# 2025q1 Homework5 (assessment)
contributed by < `Jordymalone` >
## 檢視前 6 週學習狀況 (含程式碼審查和課堂討論)
## 記錄閱讀〈因為自動飲料機而延畢的那一年〉的啟發
這幾週參與 Linux 核心設計的課程,在寫作業和看老師提供的材料時,心裡總是浮現一種 **我真的理解了嗎** 的疑惑。許多內容就像是囫圇吞棗,我能照著做,卻無法說清楚**為什麼**要這樣做。當卡住時,我會去參考其他同學的成果。每次看到他們的邏輯清晰、實作細緻,我心中總忍不住想:「他們怎麼那麼猛啊?我怎麼那麼菜?」那種既羨慕又懷疑自己的感覺揮之不去。
從《因為自動飲料機而延畢的那一年》這系列文章中看到了很多啟發和引人省思的名句,也非常佩服筆者在面對重重困難下,卻依然選擇面對的精神。Jserv說:「你該學習的不是看到事情要完蛋了就去避免失敗,而是應該學習如何處理與承受失敗,你才能變得比以前更強大。」這句話讓我重新看待自己卡關的樣子: 不會,是正常的。懷疑自己,是成長的信號。而不放棄理解,才是值得被紀錄的努力。
就像文章裡也說過:「從來就沒有一件事情是容易的。」
即使我現在的作業稱不上是屍體,但套用老師說的 **缺什麼補什麼**,繼續努力。
## 問題紀錄
* [Linux 核心設計: 針對事件驅動的 I/O 模型演化 研讀筆記](https://hackmd.io/@JordyMalone/HJJVKYQkxg)
在探討 I/O models 中,有提到說進入 kernel mode 會分成兩階段 **wait for data** 和 **copy data from kernel to user**,為什麼要分成這兩個階段?
文中也有提到 blocking vs. non-blocking I/O 探討的是 I/O 操作的 **觸發階段** 又是什麼意思? 不董與 **完成階段** 兩者想表達的意思
* [研讀 kecho](https://hackmd.io/@JordyMalone/kecho)
在使用 drop-tcp-socket 時,我們有為它定義以下 callback 函式:
```c
#ifdef HAVE_PROC_OPS
static const struct proc_ops droptcp_proc_fops = {
.proc_open = droptcp_proc_open,
.proc_write = droptcp_proc_write,
.proc_release = droptcp_proc_release,
};
#else
static const struct file_operations droptcp_proc_fops = {
.owner = THIS_MODULE,
.open = droptcp_proc_open,
.write = droptcp_proc_write,
.release = droptcp_proc_release,
};
#endif
```
為什麼會需要這個函式? 不能直接用核心提供的 system call 嗎?
* select
> select() 可能回報某個 socket fd 為「可讀」,但接下來的 read 卻仍可能阻塞。例如,資料雖到達,但因檢查碼錯誤被丟棄,導致後續無資料可讀。故建議對不應阻塞的 socket 加上 O_NONBLOCK 旗標
:::info
為什麼會有資料到達,但檢查碼錯誤被丟棄,導致後續無資料可讀的狀況? 不懂..
:::
:::info
我理解 select 的 return value 是 fd 就緒的數量,但她是在什麼情況下會停止輪詢並回傳就緒的 fd (假設今天有就緒的 fd),是馬上有就緒就回傳嗎?還是會累積到一定的數量?
:::
## 想投入的專案
> [2025q1 Homework1 (ideas)](https://hackmd.io/@JordyMalone/linux2025-ideas)
### 一對一討論
* 2025/05/15
* - [ ] TODO: ktcp / khttpd