ldd3驅動程序學習1---理解scull設備

scull設備是一個操作內存的字符設備,不是真正的設備,只是向內核註冊爲字符設備,並使用內存來存取數據。
當用戶向其中寫數據時,它就申請空閒內存來存放用戶數據;當用戶讀取其數據時,便按順序讀取數據。
接下來兩個結構貫穿整個驅動,理解它是很必要的。
struct scull_qset {
void **data;
struct scull_qset *next;
};
struct scull_dev {
struct scull_qset *data;
int quantum;  
int qset;  
unsigned long size;  
unsigned int access_key;
struct semaphore sem;  
struct cdev cdev;
};
當申請內存空間時,不大可能一次完全申請需要的空間,只有需要(用戶寫)的時候纔去申請內存,這就存在零散的內存區域,也需要管理這些零散的區域。故此,出現了上述的結構來來維護之!

struct scull_qset 量子集結構
所謂量子就是每次申請分配內存的最小單位,量子集就是這些最小單位的集合。(作者這麼設計的,不是內核的概念)
void **data 這是個二重指針,表明它指向的單元存放的是一個指針,這個指針指向的地址才存放着真正的數據(量子)。
struct scull_qset *next 指向下一個量子集。
這個量子集是多大呢,通過這兩個成員無法判斷這個集合究竟多大。這是scull_dev來維護的。

struct scull_dev scull設備結構,維護該設備的所有數據
struct scull_qset *data,它指向第一個量子集。
quantum 量子大小。所有量子大小相同,只需這裏維護。如果說每個量子集中量子大小不一致,那就需要把這個成員下移到量子集管理結構中。
qset 量子集大小,表明量子集中量子個數。同上面的理由一樣,scull設備被設計爲它的所有量子集大小一致。
size 設備中保存的數據量。
access_key  /* used by sculluid and scullpriv */ 未見使用
sem 互斥量,互斥量經常使用於存在可能同時訪問共享資源的情況下。
cdev 註冊字符設備就要靠它了。把它集成在cull_dev是相當有用的。看cull_open函數(用戶open時)中,dev = container_of(inode->i_cdev, struct scull_dev, cdev); 這樣可方便地從cdev得到cull_dev,有時也把它設置爲全局變量,但是這並不夠靈活。在後面的驅動程序會體會到這種做法的好處。
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章