顯示具有 Linux 標籤的文章。 顯示所有文章
顯示具有 Linux 標籤的文章。 顯示所有文章

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 是固定格式要減掉)




介紹 Linux 兩個好用的指令

1. Ctrl + E  ==> VirtualBox 螢幕截圖

2. Ctrl + Alt + F1\F2\F3\F4  ==> 切換 tty

2025年7月3日 星期四

半死不活的讀取線程優先權範例

這個程式原本想宣告兩個線程,通過設定優先權和 schedule () 函式決定兩個線程的執行順序,但 kthread_run callback function 一宣告就會執行,所以此功能無法做出,改為讀取線程優先權。(MAX_NICE 19MIN_NICE -20DEFAULT_PRIO 120) 











Linux 之進程管理 (進程是阿共在用的我不知道台灣怎麼翻譯)

可喜的是這是一支 Module 不是 AP,對於 boot 小板子來說 AP 幾乎一點用也沒有,程式是從 kernel source code 抄出來的,沒有參考網路資料,但也確實是非常簡單。





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日 星期一

Frame Buffer 測試成功

這只是一個 AP,沒有改到 Linux 裡面的 CodeResolution 1280 x 800,沒啥學問。




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月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=nLOCALVERSION="clouddai"CONFIG_MODULE_SIG_KEY=""CONFIG_SYSTEM_TRUSTED_KEYS=""CONFIG_SYSTEM_REVOCATON_KEYS=""CONFIG_MODULE_SIG=nCONFIG_MODULE_SIG_ALL=n』。然後就可以開始 build kernel,請依序鍵下如下指令『make -j$(nproc)make modules_installmake 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日 星期六

Linux 的 GPIO

事實上 Linux GPIO 是很難的,牽扯到平台總線設備\驅動和 Pinctrl,但我用了作弊的方法 (直接操作 IO),範例如下




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 DevicePlatform Driver 下篇介紹 



/sys/devices/platform/ 會看到創建出來的平台設備




2025年6月17日 星期二

測試 cdev

應用程序如下,編譯會有 warning 但不影響 (比如 gcc open 要改用 fopen),這個應用程序就是對 /dev/my_cdev OpenReadWriteClose 的動作,結果會出現在 dmesg (記得要掛載 module),編譯應用程序的指令如下『gcc  my_cdev_app.c  -o  my_cdev_app





重開機 /dev/my_cdev 就消失了,但其實改設定檔就可以,看來 Linux 之路還漫長啊

從核心呼叫用戶端程式

本題為從內核端呼叫用戶端的執行程序,把模組載入到內核代表從內核端呼叫 (dmesg 觀察)/usr/sbin/shutdown 是用戶端程序,執行後關機。