執行人: tab08222
專題解說錄影
第 2 週測驗題嘗試檢驗學員對位元操作的認知,本任務強化相關練習,預計完成以下:
next_pow2
的實作和 Linux 核心相關程式碼分析應該一併整理第二次作業中,學員提交的相關成果,清楚標註出處、修正描述及重現實驗。
next_pow2
的實作和 Linux 核心相關程式碼分析重做第 2 週測驗題測驗一:
__builtin_clzl
改寫,注意未定義行為這段程式碼的目標在於找出大於或等於 X
的最小冪值,原理是把最高位元的 bit 一路填到最後一個位元,最後加 1 來達到目標。例如:5的二進制表示法為0b0101,再透過把最高位元的 bit 一路填到最後一個位元之後會變成0b0111,最後 +1
,也就式0b1000(8)
根據 builtin_clz
的定義
Returns the number of leading 0-bits in x, starting at the most significant bit position. If x is 0, the result is undefined.
以 x = 15 為例子,由於 x 需要用到 4 個位元來表示,這代表前面有 28 個連續的0,因此 __builtin_clz(x)
會回傳 28,而 __builtin_clzl
是 unsigned long 因此 __builtin_clzl(x)
會回傳 60,以下是用 __builtin_clzl
改寫的版本
以 compiler explorer 產生 x86 指令
其中 bsr (Bit Scan Reverse) 的定義為
Searches the source operand (second operand) for the most significant set bit (1 bit). If a most significant 1 bit is found, its bit index is stored in the destination operand (first operand).
這段程式碼的目的是在確保配置的記憶體塊可以滿足硬體快取和架構的對齊要求,並以此來達到有效的記憶體配置。
bset.c 是用於管理和操作 bcache 中的資料結構,以實現有效的磁碟快取和提高儲存系統的性能。其中 __inorder_to_tree
的目的是確保 j
在特定範圍內並符合樹狀結構的要求。roundup_pow_of_two(size)
與next_pow2
的功能不相同。以下列出roundup_pow_of_two的定義
__roundup_pow_of_two
的定義如下
這兩個函式會回傳不大於 n 的 2 冪值,而next_pow2 則是會回傳不小於 n 的 2 的冪值。
功能與 clz、 clzl 類似,回傳值代表第一個 1 出現在由右數來第幾個 bit,例如15=0b1111,則fls(15) 就會回傳 4 。
重做第 2 週測驗題測驗三:
utf-8字元可由一個首位元組,和1、2、3個後續位元組組成。這段程式碼的目的在於找出首位元組的數量,也就是開頭不是10的位元組,而首位元組也代表輸入的字串包含幾個字元。-65的二進制表示法為0b10111111
,並且所有大於-65的位元組皆不符合後續位元組的定義(0xx.xxxx),因此以-65為 magic number
在以上程式碼當中,透過觀察變數宣告的部分可以發現此 for 迴圈是以 8 個 byte 為一組進行的,for 迴圈內部的程式碼用於實作 not bit 6 and bit 7
,而 count
代表後續位元組的數量,因此通過計算給定的 len
包含幾組再減去後續位元組的數量即為字元數量,再由 count_utf8
來進行計算其他部分。
這段程式碼式用來將Unicode 字元轉換為 UTF-8 編碼的字節序列
這段程式碼是用來判斷字串s1、s2是否相等。其中utf8ncursor
可以用來判斷輸入是否符合規定,若不符合則 return -EINVAL 。根據errno-base.h ,EINVAL 代表參數錯誤
重做第 2 週測驗題測驗四:
這段程式碼的目的在於檢測 X 是否僅用一段連續的1(長度為 1~16 bits)以及一段連續的 0 (長度為0~15 bits)所組成,另一種解釋方法是,當 X 在不斷被向左位移的同時,必須確保 X 的最高位元是 1,或 x = 0
若 x
為正確的樣式,則 -x
必定會讓最後一個1 變成 0 ,因此 (n ^ x) < x
必定成立。若 x
不是正確的樣式,雖然最後一個 1 同樣會被替換成 0,但前方至少也會有一個 0 被替換成 1,因此 (n ^ x) > x
這段程式碼用於生成 ipv4 子網路遮罩,子網路的生成有利於進行子網路計算、過濾或路由等操作序。其中 logmask 代表遮罩長度,最後使用 htonl 函式將其轉換為網路字節序。
子網路遮罩用於將IP位址劃分為網絡地址和主機地址,並在網絡中劃分子網路。它是計算機網絡中一個重要的概念,用於確定網絡的範圍、劃分子網路、控制通信流量和實施安全性。
ChatGPT
以上程式碼是用於 NUMA 系統中,找到最佳節點來配置記憶體空間,其中運用 used_node_mask
來分辨那些節點是已被使用的,以及那些節點是可用的。cpumask_of_node
可以產生 cpumask,並作為cpumask_empty
的參數,若此時 node n 沒有配置處理器 則回傳 0 ,並為 val
加上 penalty
。
probe_irq_mask
函式用於走訪系統中的中斷描述子,檢查其中被標記為自動探測的中斷,並生成一個中斷遮罩,其中每個被探測到的中斷對應的位元被設置為 1。