contributed by < linjohnss
>
lsmod
的輸出結果有一欄名為 Used by
,這是 “each module’s use count and a list of referring modules”,但如何實作出來呢?模組間的相依性和實際使用次數 (reference counting) 在 Linux 核心如何追蹤呢?
搭配閱讀 The Linux driver implementer’s API guide » Driver Basics
fibdrv.c
存在著 DEFINE_MUTEX
, mutex_trylock
, mutex_init
, mutex_unlock
, mutex_destroy
等字樣,什麼場景中會需要呢?撰寫多執行緒的 userspace 程式來測試,觀察 Linux 核心模組若沒用到 mutex,到底會發生什麼問題。嘗試撰寫使用 POSIX Thread 的程式碼來確認。自從 Linux 核心 4.4 版以來,Ubuntu Linux 預設開啟 EFI_SECURE_BOOT_SIG_ENFORCE,這使得核心模組需要適度的簽章才可掛載進入 Linux 核心,為了後續測試的便利,我們需要將 UEFI Secure Boot 的功能關閉,請見 Why do I get “Required key not available” when install 3rd party kernel modules or after a kernel upgrade?
linux-headers
套件linux-headers
套件已安裝修改 /etc/default/grub,修改完成後 sudo update-grub
來更新設定。
先根據作業提示用 ktime API 實做 kernel space 的時間量測
原先為 VLA 形式的宣告。
根據費氏數列定義,可以發現只須利用 3 個變數來實做,不須紀錄之前的數列。
在作業要求中提及了一個更快的演算法 fast doubling,我們可以用 F(0) = 0, F(1) = 1, F(2) = 1
推導出隨後的數值。
從下圖可以看出 fast doubling 整體效率會比 interative 還要好。
前面的 h
計算我們可以改用 clz 處理。
從下圖可以看到使用 clz 加速的 fast doubling 算法所需的時間快一些。
原先的演算法在 都會產生 Overflow 的問題,因此我們可以用 big number 來嘗試解決問題。
結構的部份,利用兩個 unsigned long long
來處理 F93 之後 Overflow 的問題。
參考作業提示的方法實做 BigN
加法。
參考 KYG-yaya573142 的作法進行改寫,將 BigN
轉成 string
。
將原先的 iterative 作法,long long
用 BigN
來代替,並且加法用 addBigN
來處理。
實測到 F186 都是正確的
Big number 結構改為一個 string 與一個 interger,利用 string 紀錄每個位數的值,而 digit 負責紀錄目前的位數。
init_BigN 會先初始化 BigN,使 BigN 的 string 全為 (char) 0
、digits = -1
。
接著根據 input
的數字轉成 char 給 big number。
將兩個 BigN 相加,並將成果存在另一個 BigN。
c
為 0,接著判斷 a
, b
誰的位數較高,用來配置 c
的位數將結果字串轉成 0~9
的字串
實測到 231 都是對的,超過會發生 Segmentation fault