alloc_pages 是申請一個 page 而 page_address 是把 page 轉為實體記憶體位址,page 其實是一個指標,用 (unsigned int) 強制轉換編譯會有 warning,但想不到更好的做法。
Cloud Dai
2025年7月9日 星期三
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日 星期六
2025年7月4日 星期五
System Call (IPC 行程間通訊)
這章是教 Syscall,原本想自己新增一個但編譯不過,所以只好呼叫既有的,我選的是 msgsnd 和 msgrcv,這兩個函式用來做 IPC (行程間通訊)。(message 的第一個 long 是固定格式要減掉)
訂閱:
意見 (Atom)







