編寫linux驅動先看一下驅動框架是什麼樣子的。
驅動編寫和應用層編寫有什麼區別呢?
(一)首先 入口函式的問題。應用層編寫我們的入口就是main函式,但在驅動編寫時不是這樣的,有兩種情況,
1、預設情況下
int __init init_module(void) 載入模組時的初始化函式,也就是驅動模組的入口函式
void __exit cleanup_module(void) 解除安裝模組時的函式,也就是解除安裝某個驅動時要執行的函式 2、
static int __init ***x_init(void) 載入模組時的初始化函式,也就是驅動模組的入口函式
static void __exit ***x_exit(void) 解除安裝模組時的函式,也就是解除安裝某個驅動時要執行的函式
上述兩種情況相比,我們一般用第二種,因為第一種的名稱是固定的,我們不能做更改,第二種我們可以改寫***x為我們自己模組的名字。可以達到見文知義。
在用第二種模式時,我們要首先用固定格式宣告一下:
module_init(***x_init);
module_exit(***x_exit);
來表明載入初始化函式和解除安裝函式。
(二)c語言的標準函式庫不能使用
驅動屬於核心的一部分,我們此時還無法使用類似像printf這樣的c庫,但是核心會提供自己的c庫,在核心中我們用printk代替printf函式。
(三)新增license宣告
linux是開源的系統,那就要我們遵守一定的規範,我們一般用gpl規範,所以在驅動編寫時都要宣告一下
module_license(「gpl」);
基本的區別就是這些,我們來看乙個簡單的驅動框架
#include #include #include module_license("gpl");
static int __init demo_init(void)
static void __exit demo_exit(void)
module_init(demo_init);
module_exit(demo_exit);
完成驅動編寫後,如何才能載入到核心呢?我們需要通過makefile
生成.ko檔案,乙個簡單的makefile如下,這是在ubutnu下的makefile,如果換為arm平台下的linux需要更換源檔案目錄。具體解釋可以看核心模組編譯makefile入門。執行make即可生成模組.ko檔案
$(warning kernelrelease = $(kernelrelease))
ifeq ($(kernelrelease),)
#核心的原始碼路徑, ?= 條件賦值, uname -r 得到核心的版本號
kerneldir ?= /lib/modules/$(shell uname -r)/build
# := 立即賦值, 得到當前的絕對路徑
pwd := $(shell pwd)
# -c 切換工作路徑, make -c
modules:
$(make) -c $(kerneldir) m=$(pwd) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions module* modules*
.phony: modules clean
else
# 生成模組
obj-m := used.o
endif
下面我們來看幾個驅動中常用的命令1、載入驅動模組insmod將生成驅動模組.ko檔案載入,
insmod ***.ko
載入後就會執行***x_init函式
2、解除安裝驅動模組rmmod
對應的解除安裝驅動的命令
rmmod ***x 注意不用帶.ko
3、檢視核心中的模組資訊
lsmod
4、檢視模組的描述資訊
modinfo ***x.ko
我們可以在驅動程式新增一些輔助資訊,例如作者 ,驅動描述等。
5、檢視模組列印資訊
dmesg
printk是核心列印函式,預設模式下在中斷下無法顯示(當然,可以設定成列印到終端),用dmesg可以檢視一下列印到核心的資訊。
上述幾個比較常用,有其他的我們可以以後再看。
我們把上述幾個熟悉一下
載入模組後執行初始化函式,列印函式名和行號
解除安裝模組後執行解除安裝函式,列印函式名和行號
列印模組資訊 modinfo
檢視核心中模組資訊lsmod
module為模組名稱 size為模組打下 usedby 表明有幾個其他檔案使用
實際上lsmod是讀取並分析「/proc/modules」檔案,我們來看一下這個檔案
核心已經載入的模組的資訊也存在於/sys/module目錄下,載入demo.ko後,核心中將包含/sys/moudle/demo目錄,demo的目錄樹結構如下
除了使用insmod載入模組以外,還可以用modprobe命令來載入模組,並且使用modprobe載入模組時,會同時載入模組所依賴的其他模組。insmod必須按順序乙個乙個載入模組。同樣在解除安裝時,modprobe -r filename的方式會同時解除安裝該模組所依賴的模組。
模組之間的依賴關係放在/lib/modules檔案中。實際上是在整體編譯核心的時候由depmod工具生成的,該檔案的格式很簡單:有依賴的直接在「:」後面加上。
Linux驅動 按鍵驅動
開發板 tiny6410 核心版本 linux2.6.38 要想寫出案件驅動 需要複習的知識 1 混雜裝置的使用原理 2 系統呼叫驅動函式的原理 3 中斷處理機制 4 阻塞性裝置驅動的書寫規範 1 混雜裝置的註冊和使用比較簡單,以前也複習過,這裡不再複習 3 中斷處理機制 也有部落格內容中斷處理機制...
linux 字元驅動驅動
由於沒有經過完整測試 中可能會有不足之出,如有發現還請斧正 這是乙個學文件,所有 僅供學習使用,請勿在生產環境中使用 字元驅動是linux驅動學習的第一站,該 完成了乙個最簡單的字元驅動以及乙個最小化打測試 應用測試 僅做了open的測試 int main int argc,char argv pr...
Linux驅動程式設計(一)
簡單的linux驅動 mem.c檔案 include include module license gpl static int mem init void static void mem exit void module init mem init module exit mem exit mak...