這篇文章主要總結了我學習嵌入式系統中,乙個字元裝置驅動的構建和執行過程。這篇總結中我會盡量簡潔地告訴你在ubuntu(linux)中字元裝置驅動的程式設計方式,乙個簡單的模組用c如何進行構建,並且如何將它作為核心模組動態地載入和解除安裝,你能夠看到這個字元驅動裝置在系統日誌中的記錄。
在這篇當中,我們會將重點放在程式結構和編譯執行載入過程,關於字元裝置和環境等等將不做詳細介紹。
字元裝置驅動的主要結構和編寫
字元裝置驅動的makefile編寫
將驅動作為動態模組進行載入
為了簡潔明瞭,我們以乙個載入時和解除安裝時候列印hello的驅動為例進行說明。
首先需要宣告該裝置的主裝置號test_major
和裝置名稱drv_name
。
其次實現關於裝置的函式,一般包括open()
,release()
,read()
,write()
,後面使用者操作的時候,kernel實際會呼叫 這些函式。
宣告乙個file_operation
結構體,然後使用標記化結構初始化語法進行初始化(關於這個可以參考標記化結構初始化,c primer plus中也有較為詳細的介紹,請參考結構相關章節)。這一步的操作將結構體中的內容和我們的實現函式進行一次「繫結」。
實現init()
函式,並且在函式內使用
register_chrdev(test_major,drv_name,&chardev_fops)
函式進行裝置號的註冊;
實現exit()
函式,並在函式內部使用
unregister_chrdev(test_major,drv_name,&chardev_fops)
函式對裝置進行登出操作。
最後記得使用module_init(test_init);module_exit(test_exit);
將裝置看作模組進行註冊登出關聯。
下面我們將給出這個hello.c程式:
#include
#include
#include
#include
#define test_major 233 //定義主裝置號
static
char drv_name = "test"; //定義主裝置名
//自己實現的開啟函式
static
int test_chardev_open(struct inode *inode,struct file *file)
//自己實現的釋放函式
static
int test_chardev_release(struct inode *inode,struct file *file )
//標記化結構體初始化
static
struct file_operations chardev_fops=;
//初始化註冊裝置
static
int __init test_init(void)
return0;}
//登出裝置
static
void __exit test_exit(void)
//進行關聯
module_init(test_init);
module_exit(test_exit);
//宣告許可證
module_license("gpl");
我們直接放上makefile檔案的**:
obj-m := hello.o
kerneldir
:= /lib/modules
/4.4.0-22-generic/build
pwd:= $(shell pwd)
modules:
$(make) -c
$(kerneldir) m=$(
pwd) modules
modules_install:
$(make) -c
$(kerneldir) m=$(
pwd) modules_install
clean:
rm –rf *.o *~ core .depend . *.cmd *.ko *.mod.c .tmp_versions
在這裡我們需要宣告以下核心所在的位置,因為我們的驅動將作為乙個模組單獨編譯進核心中去。-c
進入核心目錄,m
返回當前模組的目錄。關於詳細的驅動makefile中的細節,給出以下的參考文章:
1. linux下的makefile編寫詳解
2. linux核心模組的編譯基礎知識
3. linux裝置驅動makefile入門解析
4. 核心 __init與__exit
5. linux核心及驅動開發中有關__init,__exit和__initdata的用法
我們的驅動編寫工作可以說是進入了收尾階段,下面就需要進行編譯和載入。首先這是未編譯的狀態:
然後我們執行make
指令:
這裡我們可以清楚的看到shell進入了核心執行了makefile然後回到當前目錄生成ko檔案。這個就是我們的模組檔案。在當前目錄下我們執行insmod
指令就可以將我們的模組動態進行載入。
這裡的效果我們需要通過系統日誌才能看到,開啟/var/log/syslog檔案就可以看到(中間的「hello,mr.bubbles」):
然後我們嘗試進行解除安裝,使用rmmod
就可以解除安裝當前的模組 :
最終模組被成功解除安裝,顯示「goodbye,mr.bubbles!」字樣。
雖然是考試前的複習,但是如果不自己動手親自寫一下的話是體會不到其中的樂趣的,當然這個介紹只是一點簡單的總結,很多細節都被略過了,要對其有更好地了解還需要自行補更多的知識,當然,embedded system還有很多好玩的東西,希望這篇可以幫助我回顧,同時與大家共勉。
歡迎提出各種意見和建議,共勉。
對了,以前扒資料就發現有直接貼上不貼出處的,這樣可不好啊,這些人注意下0_0
arm linux驅動開發之字元裝置驅動開發
1 先要了解裝置函資料結構 2 然後將驅動註冊到核心中 define chrdevbase major 200 主裝置號 define chrdevbase name chrdevbase 裝置名 static char readbuf 100 讀緩衝區 static char writebuf 1...
驅動 linux裝置驅動 字元裝置驅動開發
preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...
Linux裝置驅動之《字元裝置驅動》
linux裝置中最大的特點就是裝置操作猶如檔案操作一般,在應用層看來,硬體裝置只是乙個裝置檔案。應用程式可以像操作檔案一樣對硬體裝置進行操作,如open close read write 等。下面是乙個字元裝置驅動程式的簡單實現test.c 模組分析 1.初始化裝置驅動的結構體 struct fil...