字元裝置驅動開發

2021-10-14 11:31:25 字數 2633 閱讀 2474

一、驅動模組的載入和解除安裝

linux

驅動有兩種執行方式,第一種就是將驅動編譯進

linux

核心中,這樣當

linux

核心啟動的時候就會自動執行驅動程式。第二種就是將驅動編譯成模組(linux

下模組擴充套件名為

.ko)

,在 linux 核心啟動以後使用「

insmod

」命令載入驅動模組。

在除錯驅動的時候一般都選擇將其編譯 為模組,這樣我們修改驅動以後只需要編譯一下驅動**即可,不需要編譯整個 linux

**。而且在除錯的時候只需要載入或者解除安裝驅動模組即可,不需要重啟整個系統。總之,將驅動編譯為模組最大的好處就是方便開發,當驅動開發完成,確定沒有問題以後就可以將驅動編譯進linux 核心中,當然也可以不編譯進

linux

核心中,具體看自己的需求。

模組有載入和解除安裝兩種操作,我們在編寫驅動的時候需要註冊這兩種操作函式,模組的載入和解除安裝註冊函式如下:

/* 驅動入口函式 */

static int __init ***_init(void)

/* 驅動出口函式 */

static void __exit ***_exit(void)

module_init(***_init); //註冊模組載入函式

module_exit(***_exit); //註冊模組解除安裝函式

驅動編譯完成以後擴充套件名為

.ko。使用「

insmod

」命令載入驅動的時候,

***_init

這個函式就會被呼叫。

使用「rmmod

」命令解除安裝具體驅動的時候

***_exit 函式就會被呼叫。比如載入 drv.ko 這個驅動模組,命令如下: insmod drv.ko。

二、字元裝置註冊與登出

對於字元裝置驅動而言,當驅動模組載入成功以後需要註冊字元裝置,同樣,解除安裝驅動模組的時候也需要登出掉字元裝置。一般字元裝置的註冊在驅動模組的入口函式 ***_init

中進行,字元裝置的登出在驅動模組的出口函式 ***_exit

中進行。字元裝置的註冊和登出函式原型如下所示:

/* 字元裝置的註冊 */

/** major:主裝置號,linux下每個裝置都有乙個裝置號,裝置號分為主裝置號和次裝置號兩部分。

* name:裝置名字,指向一串字串。

* fops:結構體 file_operations 型別指標,指向裝置的操作函式集合變數。

*/static inline int register_chrdev(unsigned int major, const char *name,

const struct file_operations *fops)

/* 字元裝置的登出 */

/** major:要登出的裝置對應的主裝置號。

* name:要登出的裝置對應的裝置名。

*/static inline void unregister_chrdev(unsigned int major, const char *name)

三、實現裝置的具體操作函式

每乙個 系統呼叫,在驅動中都有與之對應的乙個驅動函式,在 linux

核心檔案

include/linux/fs.h

中有 個叫做 file_operations

的結構體,此結構體就是

linux

核心驅動操作函式集合,常用的內容如下所示:

struct

file_operations

;/* 開啟裝置 */

static int chrtest_open(struct inode *inode, struct file *filp)

/* 從裝置讀取 */

static ssize_t chrtest_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)

/* 向裝置寫資料 */

static ssize_t chrtest_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)

/* 關閉/釋放裝置 */

static int chrtest_release(struct inode *inode, struct file *filp)

/* 驅動入口函式 */

static int __init ***_init(void)

return 0;

}/* 驅動出口函式 */

static void __exit ***_exit(void)

/* 將上面兩個函式指定為驅動的入口和出口函式 */

module_init(***_init);

module_exit(***_exit);

/* license採用gpl協議,作者lee */

module_license("gpl");

module_author("lee");

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

驅動開發 字元裝置1

函式的呼叫 open syscall define3 sys open char filename,inflag do sys open do file open path openat do tmpfile return fd finish open do dentry open open ino...

字元裝置驅動開發簡要

linux 驅動開發中我們需要按照其規定的框架來編寫驅動,所以說學 linux 驅動開發重點是學習其驅動框架。linux 驅動有兩種執行方式 第一種就是將驅動編譯進 linux 核心中,這樣當 linux 核心啟 動的時候就會自動執行驅動程式。第二種就是將驅動編譯成模組 linux 下模組擴充套件名...