理解scull裝置

2021-05-24 07:16:19 字數 1085 閱讀 7961

scull裝置是乙個操作記憶體的字元裝置,不是真正的裝置,只是向核心註冊為字元裝置,並使用記憶體來訪問資料。

當使用者向其中寫資料時,它就申請空閒記憶體來存放使用者資料;當使用者讀取其資料時,便按順序讀取資料。

接下來兩個結構貫穿整個驅動,理解它是很必要的。

struct scull_qset ;

struct scull_dev ;

當申請記憶體空間時,不大可能一次完全申請需要的空間,只有需要(使用者寫)的時候才去申請記憶體,這就存在零散的記憶體區域,也需要管理這些零散的區域。故此,出現了上述的結構來來維護之!

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,有時也把它設定為全域性變數,但是這並不夠靈活。在後面的驅動程式會體會到這種做法的好處。

scull裝置的使用

scull裝置的使用 by 吳垠date 2007 07 05 email lazy.fox.wu gmail.com homepage 1.寫在前面 a.在進行下面的工作之前請先閱讀我 的文章 在 linux 2.6核心下編譯可以載入的核心模組 配 置好可載入核心模組的linux環境 b.c.d....

Scull字元裝置驅動模組的記憶體使用分析

先看一下每個scull dev的資料結構的定義 struct scull qset struct scull dev 每個scull裝置都有乙個資料指標,每個指標都指向下乙個scull qset資料結構。每個記憶體區成為乙個量子quantum,這個指標陣列即它的長度成為量子集qset,這個兩個值可以...

轉個scull筆記

ldd3原始碼學習筆記之scull main scull.h main.c 標頭檔案相關定義 1.定義scull dev結構體用來描述scull裝置儲存結構 主函式流程分析 1.在程式的開始處使用module param定義模組引數 2.初始化模組module init scull init mod...