查詢驅動檔案ko Linux驅動程式學習一

2021-10-16 06:44:29 字數 3603 閱讀 3984

最近在看《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...