版本 eefdd415a78c52c30c13155b0c418399a81585e1
Chinchun Chen (陳金諄)
2024 Linux 核心實作 春季班 自我評量
- 簡介:國立成功大學電機所 114 級
- GitHub: david965154
- HackMD: david965154
成果發表與貢獻
閱讀文件時做的錯字修訂:
作業與隨堂測驗
-
這份作業中主要實作了佇列的基本操作,同時對一些特定功能進行分析,如洗牌亂度及排序時執行時間複雜度,在之後的作業三也加入了井字遊戲不同演算法及功能的實作,並閱讀 coroutine。
quiz1 + 2: HackMD
內容為分析測驗中 quick sort 、 timsort 、建立二元樹、 LRU Cache 實作及在一段特地記憶體中尋找第 N 個設定位元的函式。
quiz3 + 4: HackMD
內容為分析測驗中有效率的開根號、避免使用除法的模除運算、 \(log_2\) 、 EWMA 及漢明距離計算。
Assessment: HackMD
作業內容我選擇改進了
- 第 2 周測驗 3 : fns 函式改進
- 第 3 周測驗 2 : 不依賴任何除法指令的 % 9 (modulo 9) 和 % 5 (modulo 5) 程式碼
- 第 4 周測驗 1 : 避免重複計算、一次輸入多個字串需要同時計算 Total Hamming Distance 的版本 並紀錄閱讀〈因為自動飲料機而延畢的那一年〉的啟發,並研讀 CS:APP 3/e 第二章。
Integration: HackMD
作業中除了閱讀給定教材並分析其功能外,在自己的實體電腦運作 GNU/Linux 並實際將模組掛載至核心執行,並嘗試將 simrupt/simrupt.c 內的 simrupt_work_func 改寫為 lock-free 。
另外做的一些筆記:
期末專題
研究 vcam 在 V4L2 的框架中運作的原理,並對程式碼進行解析,最後進行 vcam 實現。
與授課教師的互動
一對一討論:5月 14日 (星期二)⋅下午9:00 - 9:30
第四週測驗一: 討論將變數取反再取二補數的原因,以及 popcount 為何是以四個 bit 作為單位的原因。
第四週測驗二: 討論在 popcount 中加上 39 以保證餘數為正的想法。
作業六: 討論主設備編號和次設備編號以 20 bit 和 12 bit 的長度進行分配的原因。
修課心得
到學期末其實發現,這門課所帶給我的收穫與預期的不一樣。說是不一樣的原因,其實是因為一開始在修這門課的期望在於可以針對不同的專案進行各種實現,並對較靠近電腦層級的操作更熟悉。然而實際上做得更多的卻是資料的閱讀、收集與統整,一方面是受限於實驗室本身研究與修課,常常在 Windows 與 Ubuntu 之間切換,並沒有足夠多的時間全力投入於作業或專題等的開發中;另一方面則是因為每次的作業中都包含了太多不熟悉的知識,在閱讀各種文件時往往需要一邊閱讀一邊整合才有辦法對整個架構有更全面的理解。這也讓我對蒐集並整合資料有更多練習的機會。
除了學習到 Linux Kernel 相關的知識之外,課程中其實也會從很多較小的角度去切入探討,讓我對整個核心的編寫邏輯也較有概念。比如說在測驗題中提到的對數值加一的步驟,在與老師討論之後才知道為了防止 overflow 的發生,因此會使用二補數相關的做法進行這項操作,這讓我聯想到在做 testing unit 時會需要針對較容易出錯的臨界值進行測試,而實作 Linux Kernel 相關的程式碼亦是如此,開發者比須先針對可能發生的不同情形想出不會讓錯誤發生的寫法,而這往往是需要大量經驗的累積與試錯才有辦法達成。這門課對我的幫助不僅僅是更了解核心程式的架構與運作,更多時候是在幫助我練習做時間規劃、事情重要程度的排序、在力所能及的情況下做到最好,以及開始一項龐大且未知專案的決心。透過觀摩其他學員的文件內容也讓我可以從更多角度認知到自己的不足以及可以繼續改進的地方。
與指導教授的學習回顧
二月回顧:3月6日 週三 下午9:19
- 記憶體相關的使用 (circular doubly linked list)
- 撰寫紀錄文件並接受回饋
三月回顧:4月6日 週六 下午7:36
- 學習 Linux 核心原始程式碼中的 lib/list_sort.c
- 使用 Valgrind 分析記憶體問題
- 學習 bitwise 的 operation
四月回顧:5月9日 週四 下午9:07
- 研讀 CS:APP 3/e 前兩章
- 研讀教材〈Linux 核心模組運作原理〉
- 期末專題討論
自我評量
\((3 \times 8 \times 7 \times 6 \times 8 \times 8) ^ {1/6} = 6.33\)
使用方案 B 計分:\(1 + floor(6.33) = 7\)