2025年7月9日 星期三

申請實體記憶體位址

alloc_pages 是申請一個 page page_address 是把 page 轉為實體記憶體位址,page 其實是一個指標 (unsigned int) 強制轉換編譯會有 warning,但想不到更好的做法。






2025年7月8日 星期二

jiffies 的溢位

這題是玩點小技法!jiffies 是目前系統的時拍計數,HZ 除以 2 代表半秒後超時,那為什麼我延遲 0.5 秒卻沒超時呢?因為我把 jiffies 設為 4294967295,加 1 後溢位從 0 開始所以不會超時。 




Linux 核心鎖 (spin lock)

此為核心鎖,和之前觸發函式不同這題用到簡單的邏輯,故講解一下。進入 spinlock前若 lock_factor 1 大時線程可以向下執行;若小於等於 0 則會進入無窮迴圈,也就是等待互斥釋放,unlock 會把 lock_factor 1。當另一個線程遇到 lock 函式時,新線程因為『- -』已經把 lock_factor 設為 -1,如此當然互斥等待,等原線程 + + lock_factor 變成 0 會跳出 do-while 迴圈,如此即實現核心鎖。(前面說小於等於 0 則會進入無窮迴圈,現在又說lock_factor 變成 0 會跳出 do-while 迴圈,前後矛盾)cnt 需告成 volatile 避免被優化存取不到固定記憶體,若不使用核心鎖兩線程會交錯執行每次出來的結果都不一樣,使用核心鎖可確保一次只有一個線程能執行 cnt ++






此圖是網路原作者的核心鎖函式,但我若用小於等於 0 另一線程會死鎖 (注意紅框),應該不是他的問題是我囫圇吞棗。




2025年7月5日 星期六

映射 (IDR)

這一章教的是數據結構,共有鏈結串列、佇列、映射、二元樹四種,因為鏈結串列常見柱列太簡單二元樹太難所以我選映射來做。(Idr_alloc id 和數據做關聯)




2025年7月4日 星期五

System Call (IPC 行程間通訊)

這章是教 Syscall,原本想自己新增一個但編譯不過,所以只好呼叫既有的,我選的是 msgsnd msgrcv,這兩個函式用來做 IPC (行程間通訊)(message 的第一個 long 是固定格式要減掉)