最近在看《linux裝置驅動程式》,裡面提到需要準備乙個核心源**樹。在本人電腦上/usr/src裡面檢視到好幾個版本的linux版本,這些其實就是編譯好的核心源**,也就是核心源**樹。
二、配置linux 核心
配置核心的方法很多,主要有如下幾種:
1. #makemenuconfig //基於ncurse庫編制的圖形工具介面
2. #makeconfig //基於文字命令列工具,不推薦使用
3. #makexconfig //基於x11圖形工具介面
4. #makegconfig //基於gtk+的圖形工具介面
這裡選擇簡單的輸入,在終端輸入以下命令:
make menuconfig
說一下配置:
對每乙個配置選項,使用者有三種選擇,它們分別代表的含義如下:
或[*]——將該功能編譯進核心
——不將該功能編譯進核心
[m]——將該功能編譯成可以在需要時動態插入到核心中的**
這一步是配置過程。配置你需要的內容。配置完成以後,儲存退出。
三、編譯安裝
cd /usr/src/linux-5.4;
make -j4; //編譯核心
make modules_install //安裝模組
make headers_install //安裝核心標頭檔案
make –j4 install //安裝核心
四、問題
1、編譯時 出現錯誤,makefile中tab鍵和空格鍵的混用。圖中灰白處應該為tab按鍵結果,而不是空格,這個主要是因為直接拷貝的問題,自己手動寫**,記得用tab鍵就行。
2、執行insmod時 提示 insmod: error: could not insert module hello.ko: file exists。出現這個提示,執行一次rmmod hello 就可以了。
五、hello world模組
開始按照書上的測試hello world模組。控制台不能列印資訊。查詢資料得知:使用printk時,linux核心根據日誌級別,把訊息列印到當前控制台上,這個控制台是乙個字元裝置。這些訊息從終端輸出的前提是日誌輸出級別小於console_loglevel。
1)命令
cat /proc/sys/kernel/printk
4 4 1 7
其中第乙個「4」表示核心列印函式printk的列印級別,只有級別比他高的資訊才能在控制台上列印出來(越小級別越高),既 0-3級別的資訊:
#define kern_emerg "<0>" /* system is unusable */
#define kern_alert "<1>" /* action must be taken immediately */
#define kern_crit "<2>" /* critical conditions */
#define kern_err "<3>" /* error conditions */
#define kern_warning "<4>" /* warning conditions */
#define kern_notice "<5>" /* normal but significant condition */
#define kern_info "<6>" /* informational */
#define kern_debug "<7>" /* debug-level messages */
我的程式中設定為「kern_emerg」為0級別,比4級別高。也就是說不是級別的問題。
2)輸入以下命令
echo 8 > /proc/sys/kernel/printk //設定當前的日誌級別為7 ,最低級別
按這條指令修改為8 4 1 7,結果還是無法列印。
3)不夠列印級別的資訊會被寫到日誌中可通過dmesg 命令來檢視。
dmesg
圖二 dmesg得到的日誌輸出
根據提示查詢問題,發現linux核心自3.7核心版本以後有了核心簽名機制。查詢我的/usr/src/linux-5.4/.config關於簽名部分的設定如下:
config_module_sig=y // y 表示開啟了簽名機制。
# config_module_sig_force is not set // 模組必須有正確的簽名才能正常使用,此處沒設定
config_module_sig_all=y // y表示 核心在編譯的時候,會主動去給模組簽名
也就是說由於開啟了簽名機制而我的模組沒有簽名導致的。
解決方法:
1)新增證書
/usr/src/linux-5.4/scripts/sign-file sha512 /usr/src/linux-5.4/certs/signing_key.pem /usr/src/linux-5.4/certs/signing_key.x509 hello.ko;
按照網上資料按以上指令新增證書,結果還是無法列印輸出。
2)修改.config的配置。由於usr資料夾受到寫保護,還是在makemenuconfig介面中修改方便。具體在enable loadable module support(可載入模組支援)修改。
圖一 核心配置選項
這三項config_module_sig,config_module_sig_force,
config_module_sig_all=y 與介面配置引數的對應關係見valian1982:**)linux核心配置中關於簽名的配置選項。
我將config_module_sig對應的module signature verification設定為n。
重新編譯,安裝 核心。
重新編譯模組hello world,執行以下命令:
insmod ./hello.ko
結果還是無法列印,但是執行dmesg的hello的提示沒有了。
總結:到目前為止,我的hello模組無法將內容列印輸出到控制台,等後面找到具體問題再來補上。
ARM Linux ADC 驅動(查詢方式)
主機系統 ubuntu 11.04 核心版本 linux kernel 2.6.39 硬體平台 fl2440 開發板系統 linux kernel 2.6.28 下面是用cpu輪尋的方式來判斷ad轉換完成的 include include include include 建立裝置節點 include...
vmware softICE除錯驅動檔案
這裡介紹了如何用vs2008 ddkwizard搭建驅動開發環境。另外還要修改個批處理檔案,我的ddkwizard是裝在d盤的,所以這裡是d program files ddkwizard wizards emptydrv templates 1033這個目錄,修改ddkpostbld.cmd 使我...
驅動中占用檔案
有解鎖核心檔案控制代碼還不是因為有人惡意占用,對抗有點意思,到了最後,技術相生相剋,很多時候不是程式對抗,是人和人。boolean holdfile punicode string filename initializeobjectattributes oa,filename,obj case in...