linux字元cdev和inode的聯絡

2021-05-23 18:25:49 字數 2384 閱讀 5748

struct cdev *probes[255];

struct mutex *lock;

static struct char_device_struct *chrdevs[chrdev_major_hash_size];

#define chrdev_major_hash_size        255

下面本文通過一下三個方面以及他們的關聯來描述字元裝置驅動:

1. 字元驅動模型

2. 字元裝置的裝置號

3. 檔案系統中對字元裝置檔案的訪問

1. 字元驅動模型

每個字元驅動由乙個 cdev 結構來表示.

這是由 struct kobj_map 結構來表示的. 它內嵌了255個struct probe指標陣列

kobj_map由全域性變數 cdev_map 引用: static struct kobj_map *cdev_map;

相關函式說明:

cdev_alloc() 用來建立乙個cdev的物件

cdev_add() 用來將cdev物件新增到驅動模型中,其主要是通過kobj_map()來實現的.

kobj_map() 會建立乙個probe物件,然後將其插入cdev_map中的某一項中,並關聯probe->data 指向 cdev

struct kobject *kobj_lookup(struct kobj_map *domain, dev_t dev, int *index)

根據裝置號,在cdev_map中查詢其cdev物件內嵌的kobject. (probe->data->kobj),返回的是cdev的kobject

2. 字元裝置的裝置號

字元裝置的主,次裝置號的分配:

全域性陣列 chrdevs 包含了255(chrdev_major_hash_size 的值)個 struct char_device_struct的元素.

每乙個對應乙個相應的主裝置號.

如果分配了乙個裝置號,就會建立乙個 struct char_device_struct 的物件,並將其新增到 chrdevs 中.

這樣,通過chrdevs陣列,我們就可以知道分配了哪些裝置號.

相關函式:

register_chrdev_region( ) 分配指定的裝置號範圍

alloc_chrdev_region( ) 動態分配裝置範圍

他們都主要是通過呼叫函式__register_chrdev_region() 來實現的

要注意,這兩個函式僅僅是註冊裝置號! 如果要和cdev關聯起來,還要呼叫cdev_add()

register_chrdev( ) 申請指定的裝置號,並且將其註冊到字元裝置驅動模型中.

它所做的事情為:

1. 註冊裝置號, 通過呼叫 __register_chrdev_region() 來實現

2. 分配乙個cdev, 通過呼叫 cdev_alloc() 來實現

3. 將cdev新增到驅動模型中, 這一步將裝置號和驅動關聯了起來. 通過呼叫 cdev_add() 來實現

4. 將第一步中建立的 struct char_device_struct 物件的 cdev 指向第二步中分配的cdev. 由於register_chrdev()是老的介面,這一步在新的介面中並不需要.

3. 檔案系統中對字元裝置檔案的訪問

對於乙個字元裝置檔案, 其inode->i_cdev 指向字元驅動物件cdev, 如果i_cdev為 null ,則說明該裝置檔案沒有被開啟.

由於多個裝置可以共用同乙個驅動程式.所以,通過字元裝置的inode 中的i_devices 和 cdev中的list組成乙個鍊錶

首先,系統呼叫open開啟乙個字元裝置的時候, 通過一系列呼叫,最終會執行到 chrdev_open.

(最終是通過呼叫到def_chr_fops中的.open, 而def_chr_fops.open = chrdev_open. 這一系列的呼叫過程,本文暫不討論)

int chrdev_open(struct inode * inode, struct file * filp)

chrdev_open()所做的事情可以概括如下:

1. 根據裝置號(inode->i_rdev), 在字元裝置驅動模型中查詢對應的驅動程式, 這通過kobj_lookup() 來實現, kobj_lookup()會返回對應驅動程式cdev的kobject.

2. 設定inode->i_cdev , 指向找到的cdev.

3. 將inode新增到cdev->list的鍊錶中.

4. 使用cdev的ops 設定file物件的f_op

5. 如果ops中定義了open方法,則呼叫該open方法

6. 返回.

執行完 chrdev_open()之後,file物件的f_op指向cdev的ops,因而之後對裝置進行的read, write等操作,就會執行cdev的相應操作.

linux字元cdev和inode的聯絡

好長時間沒怎麼看書了,最近把字元裝置驅動部分又複習了一下,寫個筆記.char device driver struct cdev struct kobj map probes 255 struct mutex lock static struct char device struct chrdevs...

linux字元cdev和Inode的關係

本文所說的inode是struct inode結構體,並不是在inode塊中的inode結點。char device driver struct cdev probes 255 struct mutex lock static struct char device struct chrdevs ch...

linux字元cdev和Inode的關係

本文所說的inode是struct inode結構體,並不是在inode塊中的inode結點。char device driver struct cdev probes 255 struct mutex lock static struct char device struct chrdevs ch...