關鍵點:
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...