字元裝置驅動 架構分析

2021-05-25 06:26:23 字數 2637 閱讀 7755

好長時間沒怎麼看書了,最近把字元裝置驅動部分又複習了一下,寫個筆記.

char device driver

相關資料結構:

struct cdev ;

struct kobj_map *probes[255];

struct mutex *lock;

};static struct char_device_struct *chrdevs[chrdev_major_hash_size];

#define chrdev_major_hash_size 255

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

1. 字元驅動模型

2. 字元裝置的裝置號

3. 檔案

(6.77 kb)

2008-08-26 15:45

相關函式說明:

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裝置驅動模型架構分析 一

lddm與驅動程式密切相關,而驅動程式處於linux系統中的什麼位置呢?我們自頂向下一步步來說,先看下圖 以下內容以中的內容為主體結合自己的認識和對於4.1核心的修改,這個系列文章非常好,推薦 linux由五個部分組成 也稱作程序管理 程序排程。負責管理 cpu資源,以便讓各個程序可以以盡量公平的方...

字元裝置驅動3 字元類裝置驅動框架分析

前面的博文循規蹈矩按照無驅動框架的步驟分析了乙個簡單的字元裝置驅動,但是現如今更多是使用核心開發者提供的驅動框架來完成驅動的註冊,這樣的做法即可減少 的錯誤率,也能避免錯誤例如記憶體申請忘記釋放的問題,更能簡化驅動的開發難度,這裡就以乙個簡答的led類裝置驅動架構為例,分析字元裝置驅動框架 驅動框架...

字元裝置驅動(一) 基本架構

字元裝置的驅動程式算是驅動中比較簡單的,最基本的驅動主要由file operations register chrdev module init module exit這幾個比較重要的資料結構組成。下面逐個分析 file operations 這個結構體為驅動框架抽象了底層的具體操作,為上層提供了o...