--- tags: Linux Kernal --- # 2023q1 Homework3 (fibdrv) contributed by < [POCHUN-CHEN](https://github.com/POCHUN-CHEN?tab=repositories) > ## 自我檢查清單 - [ ] 研讀上述 ==Linux 效能分析的提示== 描述,在自己的實體電腦運作 GNU/Linux,做好必要的設定和準備工作 $\to$ 從中也該理解為何不希望在虛擬機器中進行實驗; - [ ] 研讀上述費氏數列相關材料 (包含論文),摘錄關鍵手法,並思考 [clz / ctz](https://en.wikipedia.org/wiki/Find_first_set) 一類的指令對 Fibonacci 數運算的幫助。請列出關鍵程式碼並解說 - [ ] 複習 C 語言 [數值系統](https://hackmd.io/@sysprog/c-numerics) 和 [bitwise operation](https://hackmd.io/@sysprog/c-bitwise),思考 Fibonacci 數快速計算演算法的實作中如何減少乘法運算的成本; - [ ] 學習指出針對大數運算的加速運算和縮減記憶體操作成本的舉措,紀錄你的認知和疑惑 - [ ] 注意到 `fibdrv.c` 存在著 `DEFINE_MUTEX`, `mutex_trylock`, `mutex_init`, `mutex_unlock`, `mutex_destroy` 等字樣,什麼場景中會需要呢?撰寫多執行緒的 userspace 程式來測試,觀察 Linux 核心模組若沒用到 mutex,到底會發生什麼問題。嘗試撰寫使用 [POSIX Thread](https://en.wikipedia.org/wiki/POSIX_Threads) 的程式碼來確認。 $\to$ 搭配閱讀〈[並行和多執行緒程式設計](https://hackmd.io/@sysprog/concurrency)〉 ## Linux 核心模組 ### 不小心在 `fork` 以前,`clone` 老師的專案該怎麼辦? 1. 先確認專案是誰的 ``` $ vim .git/config ``` #### 貢獻:補充共筆 :::info 觀察 fibdrv.ko 核心模組在 Linux 核心掛載後的行為(要先透過 insmod 將模組載入核心後才會有下面的裝置檔案 /dev/fibonacci) 模組載入核心: ```shell $ sudo insmod fibdrv.ko ``` ::: #### Reference counting * 核心物件被引用時:+1 * 核心物件被釋放時:-1 理想值為"0" >確保沒有未被釋放的內存貨資源。 <s> :::spoiler Reference counting解釋(ChatGPT) 在Linux kernel中,reference counting是一種管理核心物件(例如設備、文件等)的技術。它用於跟踪對核心物件的引用數量,以確保核心物件只有在所有引用它的代碼都釋放對它的引用之後,才會被完全釋放。 當核心物件被創建時,其引用計數器初始化為1。每當代碼複製對核心物件的引用時,引用計數器就會增加。同樣地,當代碼釋放對核心物件的引用時,引用計數器就會減少。只有當引用計數器的值為0時,核心物件才會被完全釋放。 Reference counting是Linux kernel中非常重要的技術,因為它可以防止釋放未使用的內存和資源,從而增強了系統的穩定性和可靠性。 ::: </s> :::danger 應閱讀 Linux 核心的正式文件,第一手材料優先。 :notes: jserv ::: #### 緩衝區溢位(Buffer Overflow) [攻擊行為-緩衝區溢位 Buffer Overflow](https://ithelp.ithome.com.tw/articles/10188599) ### 計算 leading zeros 計算出最高位整數儲存,前面還有幾個沒有用到的 bit (前面有幾個 0)。 ### Little-Endian & Big-Endian |名稱|記憶體位置排序| |-|-| |Big-Endian|`最高位` 的位元組放在 `最低` 的記憶體位址上。| |Little-Endian|`最高位` 的位元組放在 `最高` 的記憶體位址上。| [Big-Endian 與 Little-Endian 的差異與判斷程式碼](https://blog.gtwang.org/programming/difference-between-big-endian-and-little-endian-implementation-in-c/)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up