分享到plurk 分享到twitter 分享到facebook

版本 978c58899aba18cb493a0d6341f7a724624007f7

User/david965154

Changes from 978c58899aba18cb493a0d6341f7a724624007f7 to current

---
title: Chinchun Chen (陳金諄)
categories: User
...

## 2024 Linux 核心實作 春季班 自我評量

* 簡介:國立成功大學電機所 114 級
* GitHub: [david965154](https://github.com/david965154)
* HackMD: [david965154](https://hackmd.io/@david96514)

### 成果發表與貢獻

閱讀文件時做的錯字修訂:

* [lab0](https://hackmd.io/@jimmylu0303/linux2024-homework1)
* [虛擬攝影機裝置驅動程式](https://hackmd.io/@sysprog/rJEhcgoSn)
* [Linux 核心模組運作原理](https://hackmd.io/@sysprog/linux-kernel-module)
* [你所不知道的 C 語言:編譯器和最佳化原理篇](https://hackmd.io/@sysprog/c-compiler-optimization)
* [Linux 核心設計: 淺談同步機制](https://hackmd.io/@sysprog/linux-sync)
* [你所不知道的 C 語言:動態連結器篇](https://hackmd.io/@sysprog/c-dynamic-linkage)

增加快速開平方根計算 magic number 計算方法解釋:

* [從 √2 的存在談開平方根的快速運算](https://hackmd.io/@sysprog/sqrt)

### 作業與隨堂測驗
* lab0: [GitHub](https://github.com/david965154/lab0-c) / [HackMD](https://hackmd.io/@david96514/linux2024-homework1)

    這份作業中主要實作了佇列的基本操作,同時對一些特定功能進行分析,如洗牌亂度及排序時執行時間複雜度,在之後的作業三也加入了井字遊戲不同演算法及功能的實作,並閱讀 coroutine。
    - 這份作業中主要實作了佇列的基本操作,同時對一些特定功能進行分析,如洗牌亂度及排序時執行時間複雜度,在之後的作業三也加入了井字遊戲不同演算法及功能的實作,並閱讀 coroutine。

* quiz1 + 2: [HackMD](https://hackmd.io/@david96514/linux2024-homework2)
    
    內容為分析測驗中 quick sort 、 timsort 、建立二元樹、 LRU Cache 實作及在一段特地記憶體中尋找第 N 個設定位元的函式。
    - 內容為分析測驗中 quick sort 、 timsort 、建立二元樹、 LRU Cache 實作及在一段特地記憶體中尋找第 N 個設定位元的函式。

* quiz3 + 4: [HackMD](https://hackmd.io/@david96514/linux2024-homework4)
    
    內容為分析測驗中有效率的開根號、避免使用除法的模除運算、 $log_2$ 、 EWMA 及漢明距離計算。
    - 內容為分析測驗中有效率的開根號、避免使用除法的模除運算、 $log_2$ 、 EWMA 及漢明距離計算。

* Assessment: [HackMD](https://hackmd.io/@david96514/linux2024-homework5)

    作業內容我選擇改進了 
    - 作業內容我選擇改進
    1. 第 2 周測驗 3 : fns 函式改進
    2. 第 3 周測驗 2 : 不依賴任何除法指令的 % 9 (modulo 9) 和 % 5 (modulo 5) 程式碼
    3. 第 4 周測驗 1 : 避免重複計算、一次輸入多個字串需要同時計算 Total Hamming Distance 的版本
    
    並紀錄閱讀〈因為自動飲料機而延畢的那一年〉的啟發,並研讀 CS:APP 3/e 第二章。

* Integration: [HackMD](https://hackmd.io/@david96514/linux2024-homework6)

    作業中除了閱讀給定教材並分析其功能外,在自己的實體電腦運作 GNU/Linux 並實際將模組掛載至核心執行,並嘗試將 simrupt/simrupt.c 內的 simrupt_work_func 改寫為 lock-free 。
    - 作業中除了閱讀給定教材並分析其功能外,在自己的實體電腦運作 GNU/Linux 並實際將模組掛載至核心執行,並嘗試將 simrupt/simrupt.c 內的 simrupt_work_func 改寫為 lock-free 。

* 另外做的一些筆記:
    * [FNS 改進](https://hackmd.io/@david96514/HJoPc_YeR) 記錄了改進 fns 並嘗試發送 patch 的過程
    * [Linux 核心實作 2024q1 第 18 週測驗題](https://hackmd.io/@david96514/linux2024-homework5) 因為當下沒有理解程式碼行為而無法回答老師問題,事後花了點時間重新理解。
    - [FNS 改進](https://hackmd.io/@david96514/HJoPc_YeR) 記錄了改進 fns 並嘗試發送 patch 的過程
    - [Linux 核心實作 2024q1 第 18 週測驗題](https://hackmd.io/@david96514/linux2024-homework5) 因為當下沒有理解程式碼行為而無法回答老師問題,事後花了點時間重新理解。


### 期末專題

bitops: [HackMD](https://hackmd.io/@david96514/HJnf3TOQC)

1. 嘗試重現前面執行人的改進並套用至 Linux v6.8+ 版本,並提出驗證方法證明其與現有版本相容。
2. 嘗試改進第 7 周測驗找出一段記憶體位置中特定字元的演算法並貢獻
3. 修訂快速開平方根運算

### 與授課教師的互動

一對一討論:5月 14日 (星期二)⋅下午9:00 - 9:30
一對一討論: 5 月 19 日 (星期日) 下午9:30 - 10:15

* [第四週測驗一](https://hackmd.io/ft3EYSusSS2aLyRicdqTzA?view#%E6%B8%AC%E9%A9%97%E4%B8%801): 討論將變數取反再取二補數的原因,以及 popcount 為何是以四個 bit 作為單位的原因。
* [2024-04-16 問答簡記](https://hackmd.io/VyLWa5VNQG-EpDoi2WqTMw#david965154): 討論 mmap 於 fork 的應用,並理解 fork 並非越多越好。

* [第四週測驗二](https://hackmd.io/ft3EYSusSS2aLyRicdqTzA?view#%E6%B8%AC%E9%A9%97%E4%BA%8C1): 討論在 popcount 中加上 39 以保證餘數為正的想法。
* [FNS 改進](https://hackmd.io/@david96514/HJoPc_YeR): macro 定義在何時會被設定。

* [作業六](https://hackmd.io/@yinghuaxia/linux2024-homework6): 討論主設備編號和次設備編號以 20 bit 和 12 bit 的長度進行分配的原因。
* [2024q1 Homework5 (assessment)](https://hackmd.io/eebnNSnvT8KSASWLG6aw1g#%E7%A0%94%E8%AE%80-CSAPP-3e): 研讀 CS:APP 3/e 後關於使用變數型態選擇的問題。

### 修課心得
經過快一學期的課程後,我認為此堂課對我有莫大的幫助,尤其是在剛開始的 lab0 ,那次作業看似非常簡單且基本,老師也定位在 c 語言的基本學習,不過在實作時卻花了非常多時間卻無法做完。也在那次就發現自己竟然連基礎都不足,並且學期一開始應該要是最輕鬆的時候,卻能讓我幾乎沒有其他時間做實驗室的內容。儘管在繳交期限過後我沒有做完,我人嘗試取補做以把握這次修課的機會,在接下來的作業中,老師不斷的出測驗題回顧的作業,其皆出自 Linux 核心內程式碼,以引導學員能在分析過程發現可以被改進的地方並貢獻至 Linux 核心。而我也在那時發現我反而開始享受改進的過程,也深受位元運算的魅力吸引。只要一空下來想著該如何改進目前的程式碼,最後也有幸與邱冠維同學合作,雖然最後沒有成功貢獻,不過也帶給我非常大的成長,因此在最後的期末專題我也選擇了位元運算,在這次期末專題中我研讀了大量相關資料以理解這些處理背後的原理為何,這也培養了我實事求是的精神,精準的用詞與解釋才能使人成長。

到學期末其實發現,這門課所帶給我的收穫與預期的不一樣。說是不一樣的原因,其實是因為一開始在修這門課的期望在於可以針對不同的專案進行各種實現,並對較靠近電腦層級的操作更熟悉。然而實際上做得更多的卻是資料的閱讀、收集與統整,一方面是受限於實驗室本身研究與修課,常常在 Windows 與 Ubuntu 之間切換,並沒有足夠多的時間全力投入於作業或專題等的開發中;另一方面則是因為每次的作業中都包含了太多不熟悉的知識,在閱讀各種文件時往往需要一邊閱讀一邊整合才有辦法對整個架構有更全面的理解。這也讓我對蒐集並整合資料有更多練習的機會。
在上次課程中,我因為沒能理解 2024q1 第 18 週測驗題 裡的演算法概念而無法回答老師的問題,在那堂課我有深刻的體會到安慰的話無助於進步,因為老師的直言。雖然已經過去了,但我還是因為過程而在結束後嘗試去理解其作法並解釋於上方筆記中,我透過又更深的理解快速除法的概念,也不全然是壞事。

除了學習到 Linux Kernel 相關的知識之外,課程中其實也會從很多較小的角度去切入探討,讓我對整個核心的編寫邏輯也較有概念。比如說在測驗題中提到的對數值加一的步驟,在與老師討論之後才知道為了防止 overflow 的發生,因此會使用二補數相關的做法進行這項操作,這讓我聯想到在做 testing unit 時會需要針對較容易出錯的臨界值進行測試,而實作 Linux Kernel 相關的程式碼亦是如此,開發者比須先針對可能發生的不同情形想出不會讓錯誤發生的寫法,而這往往是需要大量經驗的累積與試錯才有辦法達成。這門課對我的幫助不僅僅是更了解核心程式的架構與運作,更多時候是在幫助我練習做時間規劃、事情重要程度的排序、在力所能及的情況下做到最好,以及開始一項龐大且未知專案的決心。透過觀摩其他學員的文件內容也讓我可以從更多角度認知到自己的不足以及可以繼續改進的地方。
最後非常感謝 Jserv 能開一堂這麼充實的課程

### 與指導教授的學習回顧

* 二月回顧:3月6日 週三 下午9:19

    1. 記憶體相關的使用 (circular doubly linked list)
    2. 撰寫紀錄文件並接受回饋

* 三月回顧:4月6日 週六 下午7:36

    1. 學習 Linux 核心原始程式碼中的 lib/list_sort.c
    2. 使用 Valgrind 分析記憶體問題
    3. 學習 bitwise 的 operation

* 四月回顧:5月9日 週四 下午9:07

    1. 研讀 CS:APP 3/e 前兩章
    2. 研讀教材〈Linux 核心模組運作原理〉
    3. 期末專題討論
* 二月回顧:3月7日 週四 下午11:23
    - 學習有效率的應用時間
* 三月回顧:4月8日 週一 下午7:38
    - 對於已經超過繳交期限的作業再去嘗試完成
* 四月回顧:5月16日 週四 上午1:32
    - 嘗試發送 patch 貢獻至 linux 核心的過程

### 自我評量
$(3 \times 8 \times 7 \times 6 \times 8 \times 8) ^ {1/6} = 6.33$ 
$(5 \times 8 \times 8 \times 7 \times 8 \times 7) ^ {1/6} = 7.07$ 

使用方案 B 計分:$1 + floor(6.33) = 7$
使用方案 B 計分:$1 + floor(7.07) = 8$