Linux字元裝置驅動框架總結

2021-09-11 09:20:51 字數 2564 閱讀 1710

對於linux而言,一切皆檔案,在linux系統下,所有檔案都可以像文字檔案一樣open、read、write,那麼對於linux裝置驅動而言,比如現在有乙個點燈的驅動程式,它的裝置節點是/dev/***,當應用程式執行open、read、write的時候,是如何呼叫到驅動程式裡的open、read、write的呢,

user space:

c庫(呼叫後,會產生軟體中斷,執行系統呼叫)

kernel space:

system call

vfs                          sys_open     sys_read     sys_write

device driver            ***_open     ***_read      ***_write

static struct file_operations ***_fops = ;
總的來說就是驅動程式會將這些資訊告訴給核心,也就是核心在某個資料結構中根據主裝置號將這些資訊記錄起來,當應用程式執行對應的函式時,會根據檔案提供的屬性以及主裝置號在這個資料結構中查詢對應的項,最後找到該裝置的file_operation,然後通過這個結構題呼叫驅動的open、read、write等。

關於vfs(虛擬檔案系統):vfs是linux核心中的乙個軟體抽象層,通過一些資料結構及方法向實際的檔案系統提供介面,遮蔽了不同檔案系統之間的差異,是實現一切皆檔案的關鍵,這一段話是在書上看到拿了一些較重要的來記錄,目前理解還比較淺顯。

驅動程式中如何去註冊這些資訊呢,使用下面的這個函式去實現註冊,如下:

register_chrdev(major, "driver_name", &***_fops);
第一項為 主裝置號(為0時,系統自動分配,然後返回主裝置號),第二項是名字(不重要),第三項是關聯的file_operation,這裡就能猜到,其實驅動的file_operation是和主裝置號繫結的。到這兒就有問題了,應用程式裡的/dev/***是如何來的呢?

可以使用 mknod /dev/*** c major minor手動建立,也可以在驅動程式裡自動建立,顯然,讓驅動程式自動建立更為合理,那麼如何建立呢,這裡也涉及到mdev,這裡就不詳細的去說明了(mdev),註冊乙個裝置驅動時,會在/sys/目錄下生成一些資訊,mdev的作用就是根據這些資訊去生成裝置節點,也就是/dev/***,那麼我們驅動程式裡只負責提供這些資訊即可,乙個驅動如何提供這些資訊呢?如下

...........

static struct class ****_class;

static struct class_device ****_class_dev;

...........

static int first_drv_init(void)

...........

然後就可以在/sys/class/這個目錄下找到對應的資料夾,資料夾下就是對應的裝置資訊,關於驅動程式載入和解除安裝的時候mdev為什麼能夠自動的建立和刪除相應的資訊(前面說到mdev會自動建立這些資訊,那麼就應該可以自動刪除這些資訊),這兒就涉及到hotplug機制,以後進一步了解

附上程式:

#include #include #include #include int main(int argc, char **ar**)

if (argc != 2)

if (strcmp(ar**[1], "on") == 0)

else

write(fd, &val, 4);

return 0;

}

device driver:

#include #include #include #include #include #include #include #include #include #include static struct class ****_class;

static struct class_device ****_class_dev;

volatile unsigned long *gpfcon = null;

volatile unsigned long *gpfdat = null;

static int ***_open(struct inode *inode, struct file *file)

static ssize_t ***_write(struct file *file, const char __user *buf, size_t count, loff_t * ppos)

else

return 0;

}static struct file_operations ***_fops = ;

int major;

static int ***_init(void)

static void ***_exit(void)

module_init(***_init);

module_exit(***_exit);

module_license("gpl");

以上是個人學習後對此比較簡單的總結,不足之處請指教

linux 字元裝置驅動框架

linux 字元裝置驅動是3種型別中最簡單的一種,其實就是實現 file operations 中的函式,基本實現框架如下 1,需要包含的標頭檔案 include include include include include 2.定義及實現 file operations 中的函式,file op...

字元裝置驅動框架學習總結

struct cdev dev t dev 裝置號,32位。高12位為主裝置號,地20位為次裝置號。使用下面巨集獲取主次裝置號 major dev t dev minor dev t dev 由主次裝置號生成裝置號 mkdev int major,int minor 2 struct file op...

linux字元裝置驅動基礎框架

include include include include include include include define count 1 define name chr key0 define atomic value 0 定義巨集是否使用原子變數來限定在乙個時刻只能有乙個應用程式訪問驅動 st...