alloc_pages 是申請一個 page 而 page_address 是把 page 轉為實體記憶體位址,page 其實是一個指標,用 (unsigned int) 強制轉換編譯會有 warning,但想不到更好的做法。
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 是固定格式要減掉)
2025年7月3日 星期四
半死不活的讀取線程優先權範例
這個程式原本想宣告兩個線程,通過設定優先權和 schedule () 函式決定兩個線程的執行順序,但 kthread_run 的 callback function 一宣告就會執行,所以此功能無法做出,改為讀取線程優先權。(MAX_NICE 是 19、MIN_NICE 是 -20、DEFAULT_PRIO 是 120)
2025年7月2日 星期三
Linux 之 AP 讀取網路設備名稱
這是一支 AP (if.h 請去 google 打同名關鍵字下載),由圖可知我的網路設備叫做 lo 且 index 為 1,至於 MAC Address 可能因為我是虛擬機所以值為 0 (也有能是我學藝不精),至此驅動程式的研究告一段落,接下來要轉戰 Kernel。其實我的 CrystallGame 搞得還不錯 (在 SW 的世界裡 CrystallGame 只是小型專案),雖然受到網路許多 SW 高手的熱心幫助但我證明了 FW 只要受過同等訓練也可以寫 SW,李進勇、藍資麒、萬至正、張家銘、吳哲豪、謝旻劭、張柏森可以放心了!(最讓我吃驚的是以我近 11 年工作經驗 Kernel Code 居然還有一些我不會的語法)
2025年6月30日 星期一
2025年6月29日 星期日
繼 IRQ 後 Input Sub-System 再度失敗
這個程式執行完後終端機會一直出現『l』,但稍微對程式有點概念的人 (包含蔡詠臻) 都知道這個程式的目的是觸發 IRQ 中斷,Linux 一直遇到挫折我現在真的像小布的離婚官司一樣被徹底打趴了。(I2C 無功而退、RTC 是簡易 AP、IRQ 和 Input 雙雙落馬) 但曾經如此低潮的他 (小布自述離婚官司讓他雙膝幾乎跪在地上) 卻因為 F1 電影再度攀向世界的巔峰,小布的故事告訴我們即使現狀不盡滿意 (沒工作) 但只要堅定地走下去也許美好未來正等著你我!
INT 觸發 IRQ
INT 是觸發中斷的方式,為什麼要用 0x3b 呢?因為 INT 是把 0x30 加上 IRQ,而既然我的 IRQ 是 11 加起來當然是 0x3b 啦!我真的弱得跟賽一樣,我雖然觸發了中斷但卻出現 No irq handler for vector 的 error,照網路的解法重 build 核心但解不掉,只好 po 上來。
2025年6月24日 星期二
2025年6月23日 星期一
Linux 之編譯核心 + 多重開機 (重頭戲來嚕)
我的部落格其實是速成班,台灣 Linux 第一把交椅應該是鳥哥,想把 Linux 學好還是要拜師真正的高手,我只是出怪招而已。閒話休提!因為我虛擬機灌的是 Ubuntu 官方的 ISO 檔,Ubuntu 有自己加上一些補丁,如果直接去 Linux 官網下載通用核心沒有這些補丁會編譯不過,所以請先鍵下這兩個指令『git config --global http.sslVerify 'false'、git clone https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/jammy (jammy 是系列代號)』。再來我們要 Copy 原本的設定檔,這也是很直覺的因為亂改設定檔有可能開不了機『cp /boot/config-$(uname -r) .config』,接下來請更動 .config 的一些設定『CONFIG_DEBUG_INFO_BTF=n、LOCALVERSION="clouddai"、CONFIG_MODULE_SIG_KEY=""、CONFIG_SYSTEM_TRUSTED_KEYS=""、CONFIG_SYSTEM_REVOCATON_KEYS=""、CONFIG_MODULE_SIG=n、CONFIG_MODULE_SIG_ALL=n』。然後就可以開始 build kernel,請依序鍵下如下指令『make -j$(nproc)、make modules_install、make install』。這樣我們的新 Kernel 就安裝完成,接下來要去設定 grub 多重開機系統,請編輯此文件『/etc/default/grub/grub.cfg』,在此文件加上『GRUB_DISABLE_OS_PROBER=false』,最後在終端機執行『update-grub』,然後請看圖:(不知為何會變成 5.15.167)
雖然我是拿 Ubuntu 客製化的 Kernel 開機 (因為需要補丁),而且是看阿共的資料不是原文,但我終也完成了這項不太容易的任務。雖然我現在弱得跟賽一樣,但我仍希望和 PEGA 嵌入式系統部門的長官和同僚們一起努力不放棄,做出台灣自己的 SDK。其實 PEGA 不用自己做處理器因為 Ubuntu 也是拿通用 Linux Kernel 做出可以在模擬 AMD 處理器開機的 ISO 檔,只要了解 Kernel 的 Setting 再自己做一些補丁 PEGA 也能和 Ubuntu 一樣做出可以開機的客製化 Kernel,如此 SDK 就有望了。可以效法 Google 的制度,一天撥兩小時做可以在 ARM 上面開機的客製化 Kernel,大家不要覺得不可能,萊特兄弟發明飛機前那時代的人也覺得在天上飛不可能啊!(第一步是研究 Makefile 和 Kconfig)
2025年6月22日 星期日
Linux 之編譯核心 + 多重開機 (先來點前菜)
編譯核心錯誤多多,所以我想弄個多重開機系統,這樣核心不能跑至少不用重灌系統。需要修改『/etc/default/grub/grub.cfg』,把裡面的『GRUB_TIMEOUT_STYLE=hidden』注釋掉,設定一個合適的『GRUB_TIMEOUT』,然後執行『update-grub』重開機後便可看到選單。
現在只有一個作業系統,接下來我會進軍雙核心,另外雖然我現在弱得跟渣一樣但仍希望
PEGA 那個職缺不是玩
Server,我希望盡可能自己做 SDK (System Development Kit)。
2025年6月21日 星期六
2025年6月20日 星期五
Linux 平台設備驅動 (驅動篇)
這篇是平台驅動程式,在安裝 Platform Driver 後驅動程式會去 Search 是否有 Match 的 Platform Device (前篇有介紹),如果有找到就會執行 Platform Driver 的 probe 函數
這是 probe 函數的內部,devm_kzalloc
和 kzalloc 的差別是 devm_kzallloc 會自動釋放記憶體,用 platform_get_resource 獲取上一篇註冊的資源;用
dev_get_platdata 獲取上一篇註冊的 HW_INFO
從 dmesg 可知 HW_INFO 的值是對的,但 Resource 上篇註冊的是 0x80000000 這裡顯示的不對,由於我才疏學淺不知原因為何。補點題外話,謠傳這些網路資料是習爸爸叫ㄚ共寫的,習爸爸認為要推廣 Linux 與美國微軟相抗衡;另外再謠傳學生喜歡看我的 Blog 因為我的 code 可以 build,但我自己知道克勞德戴螢火之光難與台灣 Linux 第一把交椅鳥哥爭輝,我才剛剛開始學而且看不懂原文。
2025年6月19日 星期四
Linux 平台設備驅動 (設備篇)
I2C (在 BIOS 架構下叫 SMBUS) 和 SPI 有自己的總線,其他ㄚ里ㄚ雜的設備掛在 Linux Platform 總線,本文先介紹如何創建 Platform Device,Platform Driver 下篇介紹
2025年6月17日 星期二
測試 cdev
應用程序如下,編譯會有 warning 但不影響 (比如 gcc 說 open 要改用 fopen),這個應用程序就是對 /dev/my_cdev 做 Open、Read、Write、Close 的動作,結果會出現在 dmesg (記得要掛載 module),編譯應用程序的指令如下『gcc my_cdev_app.c -o my_cdev_app』






























