linux驅動說開去 二 模組安裝 除錯

2021-08-15 17:20:44 字數 3049 閱讀 5738

關鍵點:

1.常用安裝解除安裝命令

2.安裝解除安裝涉及的常用符號:

3.常用除錯手段

一.安裝解除安裝命令

1.lsmod

命令格式:lsmod

shell@sc2410_box:/ $ lsmod

vcodec_service 33766 0 - live 0x00000000

2.insmod

命令格式:insmod hello.ko

shell@s3c2410_box:/mnt/internal_sd # dmesg

......

<4>[152488.613448] +hello_mod_init()!

<4>[152488.614482] -hello_mod_init()!   

shell@sc2410_box:/ $ lsmod

hello 3685 0 - live 0x00000000   

vcodec_service 33766 0 - live 0x00000000

從上面的命令我們發現2點:

1.核心維護了乙個模組安裝鍊錶

2.該鍊錶的形式為fifo

3.modinfo

命令格式:modinfo hello.ko

作用:描述了模組的依賴項,模組的作者等資訊

4.rmmod

命令格式:rmmod hello

notes:注意不是rmmod hello.ko

shell@s3c2410_box:/mnt/internal_sd # rmmod hello                                

shell@s3c2410_box:/mnt/internal_sd # lsmod

vcodec_service 33766 0 - live 0x00000000

shell@s3c2410_box:/mnt/internal_sd # dmesg                                      

<1>[152991.100502] +hello_mod_exit!

<1>[152991.101328] -hello_mod_exit!

二.常用符號:

1.module_init(hello_init)

指明模組的入口函式,當模組被載入到核心時會自動呼叫hello_init函式,初始化成功返回0,出錯則返回對應出錯碼,出錯碼定義與linux/error.h

2.module_exit(hello_exit)

指明模組的退出函式,當模組被載入到核心時會自動呼叫hello_exit函式,其完成與hello_init相反的功能,模組初始化申請的各類資源均需要再次做對應釋放

3.module_license(license)

遵循的協議,一般指明為gpl

4.module_author(author)

表示作者

5.module_description(description)

具體資訊,一般用來描述模組的使用場景,功能等

6.module_version(version)

版本資訊

7.__init

示例用法:__init hello_init()

說明:為巨集定義,給核心的暗示,給定的函式值用於模組初始化操作,所有該標記的函式均放於init.text段,模組載入後會丟棄該初始化函式以將內用他用

8.__exit

示例用法:__exit hello_exit()

說明:為巨集定義,給核心的暗示,給定的函式值用於模組初始化操作,所有該標記的函式均放於init.text段,模組解除安裝後會丟棄該初始化函式以將內用他用

三.常用除錯手段

printf:c庫函式,用於linux應用層列印除錯,不支援調整列印,只能開啟或者關閉

printk:核心列印函式,

常用格式:printk("info\n");

printf(kern_info "error\n");其中kern_info "error\n"中間為空格

#define kern_emerg 0 /*緊急事件訊息,系統崩潰之前提示,表示系統不可用*/

#define kern_alert 1 /*報告訊息,表示必須立即採取措施*/

#define kern_crit 2  /*臨界條件,通常涉及嚴重的硬體或軟體操作失敗*/

#define kern_err 3 /*錯誤條件,驅動程式常用kern_err來報告硬體的錯誤*/

#define kern_warning 4 /*警告條件,對可能出現問題的情況進行警告*/

#define kern_notice 5 /*正常但又重要的條件,用於提醒*/

#define kern_info 6 /*提示資訊,如驅動程式啟動時,列印硬體資訊*/

#define kern_debug 7 /*除錯級別的訊息*/

檢視當前控制台的列印級別

cat /proc/sys/kernel/printk  

4 4 1 7

上面四個值分別表示當前控制台日誌級別、未明確指定日誌級別的預設訊息日誌級別、最小(最高)允許設定的控制台日誌級別、引導時預設的日誌級別。

本例其中第乙個「4」表示當前控制台顯示的最低列印級別,只有級別比他高的(不包含等於)資訊才能在控制台上列印出來,既 0-3級別的資訊

修改列印級別

如修改為所有pritnk資訊都顯示,則當前控制台的列印級別應設定為8

echo "8  4    1    7" >/proc/sys/kernel/printk
另外所有printk的列印資訊都會被儲存到乙個log檔案中(包括不夠列印級別的資訊),可以使用dmesg 命令來檢視所有log。log檔案位置linux一般位於/var/log下,android一般位於/data/local/log下。

linux驅動說開去 三 模組的編譯

在linux驅動開發 一 示例中我們將hello模組編譯為hello.ko是直接採用makefile來編譯,那麼如何修改為linux核心統一的風格呢,接下來將做相關介紹 關鍵點 1.在menuconfig中新增子專案 kconfig 2.在makefile中新增子專案的編譯 makefile kco...

linux驅動學習 二 核心模組

因為linux 核心的整體結構非常龐大,包含的元件非常多,如何使用需要的元件呢?有一種方法是把所有的元件都編譯進核心檔案 zimage 或bzimage 但是這樣會產生兩個問題 一是生成的核心檔案過大 二是如果要新增或刪除某乙個元件,需要重新刪除編譯整個核心。於是我們需找另外一種機制讓核心檔案本身不...

Linux驅動模組基礎

1 模組載入函式 linux核心模組載入函式一般以 init標識宣告,典型的模組載入函式的形式如下 static int init initialization function void module init initialization function 模組載入函式必須以 module in...