---
# System prepended metadata

title: 2023q1 Homework3 (fibdrv)
tags: [Linux Kernal]

---

---
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/)

