裝置驅動程式學習筆記 1 字元裝置的生命週期

2021-04-28 13:30:08 字數 2903 閱讀 4990

by:

潘雲登

對於商業目的下對本文的任何行為需經作者同意。

寫在前面

1.本文內容對應《

linux

裝置驅動程式》第三章。 2.

字元裝置的生命週期1.

分配裝置編號

在核心中,

dev_t

型別(32

位)用來儲存裝置編號,包括主裝置號(

12位)和次裝置號(

20位)。主裝置號標識裝置對應的驅動程式。次裝置號由核心和驅動程式使用,用於正確確定裝置檔案所指的裝置。主裝置號和裝置名稱的對應關係記錄在

/proc/devices中。

major(dev_t dev);

minor(dev_t dev);

mkdev(int major, int minor);

分配裝置編號的方式有兩種:一是根據

documentation/devices.txt

檔案,選取尚未分配的裝置號,進行靜態分配。

int register_chrdev_region(dev_t first, unsigned int count, char *name);

二是使用動態分配機制獲取。其缺點是分配的主裝置號不能保證始終一致,所以無法預先建立裝置檔案。

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);

2.例項化裝置物件

即為描述裝置的結構分配記憶體並初始化。在核心中,

cdev

是表示字元裝置的內部結構,包含字元裝置的共有資訊,如裝置號

dev_t

和檔案操作

file_operations

。具體裝置相關的個性資訊可以存放在自定義的裝置結構中,如

scull_dev

,其中包含

cdev

結構。

struct scull_dev;

3.初始化並註冊裝置

在核心呼叫裝置的操作之前,必須將裝置

cdev

與檔案操作關聯起來,並向核心註冊裝置結構

cdev

。注意,核心只認識字元裝置的共有資訊

cdev

,而不關心與具體裝置相關的資訊,如

scull_dev。

void cdev_init(struct cdev *cdev, struct file_operations *fops);

int cdev_add(struct cdev *dev, dev_t num, unsigned int count);

註冊完成後,裝置的操作就會被核心呼叫。在此之前,必須完全準備好處理裝置上的操作。 4.

建立裝置檔案

通過手工執行

mknod

命令,或者通過

mknod

系統呼叫建立裝置檔案。在核心中,由

inode

結構表示,其中包含了裝置編號

dev_t

和字元裝置結構

cdev

。將裝置虛擬化為檔案,可以統一應用程式訪問裝置的介面,保持系統呼叫的精簡。

裝置號dev_t

,裝置cdev

以及裝置檔案

inode

之間是一一對應關係。 5.

操作字元裝置

應用程式通過系統呼叫,執行驅動程式定義的檔案操作,從而完成對裝置的訪問。這些操作並不直接訪問裝置檔案

inode

,而是訪問乙個稱為檔案描述符的

file

結構。該結構在開啟裝置檔案時建立。可以有多個檔案描述符

file

對應同乙個裝置檔案

inode

,從而實現多個程序對單個裝置的共享。

int (*open) (struct inode *, struct file *);

int (*release) (struct inode *, struct file *);

ssize_t (*read) (struct file *, char _ _user *, size_t, loff_t *);

ssize_t (*write) (struct file *, const char _ _user *, size_t, loff_t *);

因為在對裝置進行讀寫操作時沒有傳入

inode

,所以需要在開啟裝置時,即

open

操作中,將

cdev

的指標或者將包含裝置個性資訊的自定義結構指標賦給檔案描述符

file

中的private_data

字段。當然,也可以通過

file->dentry->inode->cdev

訪問。

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

6.解除安裝字元裝置

當字元裝置的生命走到盡頭時,應當以與建立裝置相反的順序,先向核心登出裝置結構,然後釋放裝置編號。

void cdev_del(struct cdev *dev);

void unregister_chrdev_region(dev_t first, unsigned int count);

主要資料結構的關係

Linux裝置驅動程式學習(1) 字元裝置驅動程式

linux裝置驅動程式學習 1 字元裝置驅動程式 一 分配裝置號 1 對字元裝置的訪問是通過檔案系統內的裝置名稱進行的 dev ttys0 在核心中,include dev t 用來儲存裝置編號 包括主裝置號和次裝置號。由dev t獲得主次裝置號 major dev t dev minor dev ...

驅動程式之 1 字元裝置 1

linux裝置驅動分三種,包括字元裝置驅動 塊裝置驅動和網路裝置驅動 其中本文講的字元裝置 如lcd 觸控螢幕等 只能按位元組流先後順序訪問裝置記憶體,不能隨機訪問 字元裝置的基本框架比較簡單 載入驅動時,呼叫入口函式 解除安裝驅動時,呼叫出口函式 應用程式開啟驅動裝置時,呼叫open函式 應用程式...

1 字元裝置驅動程式概念介紹

u boot的任務是啟動核心,核心的任務是啟動應用程式。應用程式會涉及很多檔案和硬體操作 當然不會直接操作硬體 比如讀寫檔案,點燈 獲取按鍵值。對於應用程式的開發人員不要求去閱讀晶元手冊,了解硬體的構造。應用程式的開發人員在使用者空間直接使用open read write等等這些被稱為系統呼叫的函式...