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等等這些被稱為系統呼叫的函式...