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

jimmylu890303 (盧俊銘)

簡介

2024 Linux 核心設計 春季班 自我評量

成果發表與貢獻 (4分)

閱讀文件時做的排版修訂:

Linux-Slab 教材

Linux-KVM 教材

作業與隨堂測驗 (7分)

  • lab0: GitHub / HackMD

    完成佇列作的操作,實作出 Fisher–Yates shuffle 及 q_sort ,再 q_sort 與 list_sort 及 tim_sort 做效能上的評估與比較

  • quiz1 + 2: HackMD

    探討 Quick sort 的效能與其時間複雜度、Timsort 各個函式及使用雜湊表實作 LRU Cache。

  • quiz3 + 4: HackMD

    分析 bitwise 的操作,內容包含整數平方根的計算、 log2 、除以 10 和取餘數等操作,使用位元操作來加速計算,減少了除法和乘法的使用、及 Popcount 計算 Hamming Distance 的操作,且外使用 GCC 提供的 built-in 函數用來優化編譯結果。

  • Assessment: HackMD

    撰寫閱讀〈因為自動飲料機而延畢的那一年〉後的心得,研讀 CS:APP 3/e 第一章、第二章並對前期作業進行改進兩題。

  • Integration: HackMD

    閱讀〈Linux 核心模組運作原理〉並對照 Linux 核心原始程式碼 (v6.1+),閱讀《The Linux Kernel Module Programming Guide》(LKMPG),並且學習實作字符設備的練習。

期末專題 (9分)

打造具備網路連線的精簡虛擬機器 : HackMD / GitHub

在這次專題中,分析 KVM 運作原理,並展示一個以 KVM 為基礎的精簡虛擬機器管理程式實作( kvm-host ),它能在 x86-64 及 arm64 平台上運作,提供了基本的 VirtIO 儲存裝置、 serial 裝置 (用來作為 console) ,並且能成功在上面執行 Linux 系統,而專題目標是在該虛擬機器上實作 Virtio-net 裝置。

並且目前正在提交 pull request 貢獻到 kvm-host 上。

與授課教師的互動 (7分)

一對一討論:5月 20日 (星期一)⋅下午2:30 - 3:00

  • 問題一: 為何後續 linux 的維護者不將不可靠信號改成可靠信號? 額外分成非即時信號及即時信號的必要性?

  • 問題二: 當在一開始 A 呼叫 setjmp 時, setjmp 會將 stack pointer, instruction pointer, the values of other registers, the signal mask 存在 jmp_buf 的 buffer 內 longjmp 作使用。但在執行 setjmp 時, pc 會指向 line 8 的位置。 當 B 使用 longjmp 時會恢復 Buf 內的資訊,那應該會執行printf(“A setjmp address”); 一次,但是真實的作用是會觸發 setjmp(Buf) != 0 行為則執行 else 內的行為。

  • 問題三: 在 /dev/ 下的裝置有 major number 和 minor number,在對 /dev/下的裝置作操作時, linux kernel 會透過 major number 去找到對應的 module , 但是若有多個 device 對應到同個 major number,也是會找相同的 module,但是要如何透過不同的 minor number 去控制不同的驅動行為 ?

修課心得 (9分)

當我開始這門課程時,我便一直在追趕進度。每次作業的死線一到,我還是無法完成作業,同時也無法掌握所有的教材,只能勉強閱讀部分內容。然而,我認識到人不可能什麼都懂,必須要取捨學習的重點。對於《你所不知道的 C 語言》這本教材,我學到了許多撰寫程式的技巧,尤其是如何使用前置處理器進行優化,並學習了位元操作(Bit Operation)。

此外,關於 Linux Kernel Module 的教材,我也受益良多,特別是學習如何使用 Character Device 進行驅動開發。在期中時,我曾仔細閱讀這部分內容,因此在期末專題進行 virtqueue 的 Operation callback function 時,我有了較清晰的概念。因為 Character Device 在進行讀寫操作時,也會呼叫相應的操作回呼函數,所以儘管我只閱讀了部分教材,但這些內容都對我來說是有幫助的。

最後,談到期末專題,在實作過程中我遇到了許多問題,網路上找不到解決方案,最終還是回去閱讀規格書,並且在規格書中找到了相關定義。這堂課帶給我最大的收穫是學會了如何查閱第一手資料。起初,我以為自己無法完成這個專題,但我仍然努力學習,最終順利完成並在線上發表,這是一個非常圓滿的結束。

總結來說,這門課程雖然挑戰重重,但我學到了許多實用的技巧和知識,這些對我未來的職涯發展都有積極的影響。

與指導教授的學習回顧 (8分)

二月回顧:3月8日 下午12:58

了解 Linux 核心中鏈結串列的實作(通用的結構(list_head))、撰寫清晰好理解的 git commit message ,並且深入學習 Linux 核心知識以提升撰寫高品質程式的能力。

三月回顧:4月8日 下午7:25

學習 Bitwise Operation 操作,許多表達式都可以透過位元運算來實現。以轉換大小寫為例,過去我總是使用較笨拙的方法,但在閱讀老師的教材後,我才發現原來可以只需一行程式碼,即將目標字母與 32 進行 XOR 運算,就能完成轉換。此外,許多 Bitwise Operation 的程式碼寫得非常藝術,也極具效率。

學習如何透過 C 語言中的前置處理器來優化和簡化程式碼。在 Linux Kernel 的程式碼中,廣泛使用了許多巨集(macro)。透過這些巨集,能夠有效地使程式碼變得更加簡潔。

四月回顧:5月11日 下午3:33

研讀黃敬群老師的《你所不知道的 C 語言》教材以及《 Computer Systems: A Programmer’s Perspective 》這本課本的前兩章,並將學習到的東西紀錄下來。 在 CS:APP 這本書中,從最基礎的事情開始介紹,介紹許多關於變數型態的事情。 在撰寫程式時,常常會遇到未知的錯誤,而這些未知的錯誤常常就是因為不同型態的變數轉換所造成的錯誤,所以在閱讀完這前兩章後,有更進一步的了解數值系統的重要性。

認識 Linux Kernel Module ,閱讀完黃敬群老師的教材後,認識到 Module 如何透過虛擬檔案系統 (Virtual File System, VFS) 與週邊裝置進行互動,並且透過 Character Device 可以將資料從 User space 到 Kernel space 間相互傳送。

自我評量

\((4 \times 7 \times 9 \times 7 \times 9 \times 8) ^ {1/6} = 7.09\)

使用方案 B 計分:\(1 + floor(7.09) = 8\)