Linux 驅動程式入門

2021-09-03 01:51:50 字數 2128 閱讀 5881

驅動是具有入口和出口的一組方法的集合,這一組方法才是驅動的核心內容。

對於字元裝置驅動程式,最核心的就是 file_operation 結構,這個結構實際上是提供給虛擬檔案系統 [ vfs ] 的檔案介面,它的每乙個成員函式一般都對應乙個系統呼叫。使用者程序利用系統呼叫對裝置檔案進行諸如操作時,系統呼叫通過裝置檔案的主裝置號找到相應的裝置驅動程式。

看圖來理清一下思路 :

理解 : 系統呼叫通過裝置檔案的主裝置號找到相應的裝置驅動程式

從下圖中,/dev 目錄下的裝置檔案可知,agpgart 的主裝置號為 10 次裝置號為 175

而且裝置檔案中,主裝置號時可以相同的,次裝置號的唯一的。

主裝置號跟次裝置號就可以用來識別乙個裝置檔案。像通過身份證號碼就可以識別乙個人一樣。

首字元c b 是識別符號, c 表示字元裝置, b 表示塊裝置

摘自 linxu 4.17.14,,在 /include/linux/fs.h中定義。用來儲存驅動核心模組提供的對裝置進行各種操作的函式的指標。該結構體的每個域都對應著驅動核心模組用來處理某個被請求的 事務的函式的位址。

struct file_operations  __randomize_layout;
file_opration 簡單的運用 :

應用層系統呼叫與驅動層 struct file_operation fops 的呼叫核心。

struct file_operations fops = ;
引數 major 如果等於 0,則表示採用系統動態分配的主裝置號。如果不等於 0,則需要通過查詢未用的裝置號來為函式傳引數

struct cdev  __randomize_layout;
對 cdev 結構的操作,核心提供了一組函式

void cdev_init(struct cdev *, const struct file_operations *);    //初始化乙個 cdev 結構

struct cdev *cdev_alloc(void); //為 cdev 結構分配記憶體

void cdev_put(struct cdev *p); //減少使用計數

int cdev_add(struct cdev *, dev_t, unsigned); //註冊裝置,通常發生在驅動模組的載入函式中

void cdev_set_parent(struct cdev *p, struct kobject *kobj);

int cdev_device_add(struct cdev *cdev, struct device *dev);

void cdev_device_del(struct cdev *cdev, struct device *dev);

void cdev_del(struct cdev *); //登出裝置,通常發生在驅動模組的解除安裝函式中

void cd_forget(struct inode *);

使用 cdev 結構註冊裝置的一般過程如下。

以動態分配裝置號為例:

申請裝置號

分配裝置結構

初始化裝置結構

新增字元裝置

無論是用 register_chrdev 還是用 cdev 註冊字元裝置都是可以的。 register_chrdev機制出現在 linux 2.6之前的核心版本中,而 cdev 出現在 linux 2.6及之後的核心版本中,不過 linux 2.6及之後的核心版本依然相容 register_chrdev 機制。

}

Linux驅動程式入門 Hello World

2008 7 16 22 06 17 收藏 列印 投 票 74 中小 linux驅動程式入門 hello world ohy 20080716 1 引言 記得在學習vc 和c語言的時候,一開始都會以乙個hello world的例子作為演示,將學者逐漸引入殿堂,這個幾乎成了計算機程式語言學習必經的乙個...

Linux驅動程式入門 Hello World

1 引言 記得在學習vc 和c語言的時候,一開始都會以乙個hello world的例子作為演示,將學者逐漸引入殿堂,這個幾乎成了計算機程式語言學習必經的乙個入門之路。當然,在學習linux程式設計的時候也是這樣,下面的例子應該是再熟悉不過了 首先用vi編寫乙個c程式 vi hello.c inclu...

linux 驅動程式 高階字元驅動程式

ioctl方法 驅動程式的原型實現 int ioctl struct inode inode,struct file filp,unsigned int cmd,unsigned long arg ioctl 命令選擇 位段結構 number direction ioc read ioc write...