字元裝置的核心抽象
字元裝置的核心抽象
顧名思義,字元裝置驅動程式管理的核心物件是字元裝置。從字元裝置驅動程式的設計框架角度出發,核心為字元裝置抽象出了一個具體的資料結構struct cdev,其定義如下:
struct cdev {
struct kobject kobj;
struct module *owner;
const struct file_operations *ops;
struct list_head list;
dev_t dev;
unsigned int count;
};
在本章後續的內容中將陸續看到它們的實際用法,這裡只把這些成員的作用簡單描述如下:
struct kobject kobj
內嵌的核心物件,其用途將在“Linux裝置驅動模型”一章中討論。
struct module *owner
字元裝置驅動程式所在的核心模組物件指標。
const struct file_operations *ops
字元裝置驅動程式中一個極其關鍵的資料結構,在應用程式透過檔案系統介面呼叫到裝置驅動程式中實現的檔案操作類函式的過程中,ops指標起著橋樑紐帶的作用。
struct list_head list
用來將系統中的字元裝置形成連結串列。
dev_t dev
字元裝置的裝置號,由主裝置號和次裝置號構成。
unsigned int count
隸屬於同一主裝置號的次裝置號的個數,用於表示由當前裝置驅動程式控制的實際同類裝置的數量。
裝置驅動程式中可以用兩種方式來產生struct cdev物件。一是靜態定義的方式,比如在前面的那個示例程式中,透過下列程式碼靜態定義了一個struct cdev物件:
static struct cdev chr_dev;
另一種是在程式的執行期透過動態分配的方式產生,比如:
static struct cdev *p = kmalloc(sizeof(struct cdev), GFP_KERNEL);
其實Linux核心原始碼中提供了一個函式cdev_alloc,專門用於動態分配struct cdev物件。cdev_alloc不僅會為struct cdev物件分配記憶體空間,還會對該物件進行必要的初始化:
struct cdev *cdev_alloc(void)
{
struct cdev *p = kzalloc(sizeof(struct cdev), GFP_KERNEL);
if (p) {
INIT_LIST_HEAD(&p->list);
kobject_init(&p->kobj, &ktype_cdev_dynamic);
}
return p;
}
需要注意的是,核心引入struct cdev資料結構作為字元裝置的抽象,僅僅是為了滿足系統對字元裝置驅動程式框架結構設計的需要,現實中一個具體的字元硬體裝置的資料結構的抽象往往要複雜得多,在這種情況下struct cdev常常作為一種內嵌的成員變數出現在實際裝置的資料機構中,比如:
struct my_keypad_dev{
//硬體相關的成員變數
int a;
int b;
int c;
…
//內嵌的struct cdev資料結構
struct cdev cdev;
};
在這樣的情況下,如果要動態分配一個struct real_char_dev物件,cdev_alloc函式顯然就無能為力了,此時只能使用下面的方法:
static struct real_char_dev *p = kzalloc(sizeof(struct real_char_dev), GFP_KERNEL);
前面討論瞭如何分配一個struct cdev物件,接下來的一個話題是如何初始化一個cdev物件,核心為此提供的函式是cdev_init:
void cdev_init(struct cdev *cdev, const struct file_operations *fops)
{
memset(cdev, 0, sizeof *cdev);
INIT_LIST_HEAD(&cdev->list);
kobject_init(&cdev->kobj, &ktype_cdev_default);
cdev->ops = fops;
}
函式的程式碼非常直白,不再贅述。一個struct cdev物件在被最終加入系統前,都應該被初始化,無論是直接透過cdev_init或者是其他途徑。理由很簡單,這是Linux系統中字元裝置驅動程式框架設計的需要。
照理在談完cdev物件的分配和初始化之後,下面應該討論如何將一個cdev物件加入到系統了,但是由於這個過程需要用到裝置號相關的技術點,所以暫且先來探討裝置號的問題。
——本段文位元組選自《深入Linux裝置驅動程式核心機制》
圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-716897
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-717398/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 字元裝置驅動 —— 字元裝置驅動框架字元框架
- 字元裝置、塊裝置、裸裝置、RAW裝置 .字元
- 字元裝置、塊裝置與裸裝置字元
- 字元裝置與塊裝置的區別字元
- Linux核心程式設計(字元裝置檔案)(轉)Linux程式設計字元
- linux核心cdev_init系列函式(字元裝置的註冊)Linuxdev函式字元
- 裸裝置、字元裝置、塊裝置不全面比較字元
- LED字元裝置驅動字元
- Linux裝置驅動之字元裝置驅動Linux字元
- 字元驅動裝置踩坑字元
- AIX 共享磁碟中的字元裝置(/dev/rhdiskn)及塊裝置(/dev/hdiskn)AI字元dev
- liunx驅動之字元裝置的註冊字元
- 深入淺出:Linux裝置驅動之字元裝置驅動Linux字元
- Linux 2.6核心的裝置模型(轉)Linux模型
- 10_註冊字元類裝置號字元
- 蛻變成蝶:Linux裝置驅動之字元裝置驅動Linux字元
- 蛻變成蝶~Linux裝置驅動之字元裝置驅動Linux字元
- linux-中塊裝置檔案和字元裝置檔案的本質區別Linux字元
- HP-UX中dev目錄下的磁碟字元裝置,塊裝置及新舊命名UXdev字元
- 字元裝置驅動——申請、建立、應用.字元
- 基於宋寶華老師的字元裝置驅動字元
- 程式設計的一些抽象核心程式設計抽象
- 核心與裝置樹編譯與燒寫編譯
- 詳解裝置指紋核心演算法演算法
- Windows核心程式設計:第10章 同步裝置IO與非同步裝置IOWindows程式設計非同步
- 半導體裝置SAP是半導體產業進步的核心發動機產業
- 給核心裝置驅動增加sysfs除錯檔案除錯
- linux核心原始碼閱讀-塊裝置驅動Linux原始碼
- 裸裝置與塊裝置的區別
- 字元裝置驅動學習之cdev_init和cdev_alloc字元dev
- 未來核心玩家首選遊戲裝置:七寸平板遊戲
- 【抽象那些事】不完整的抽象&多方面抽象&未用的抽象&重複的抽象抽象
- Linux核心程式設計(和裝置檔案對話)(轉)Linux程式設計
- 簡單linux字元裝置驅動程式與程式設計小技巧(上)Linux字元程式設計
- Linux驅動實踐:你知道【字元裝置驅動程式】的兩種寫法嗎?Linux字元
- HarmonyOS Device Certificate Kit簡介:鴻蒙裝置證書的核心功能與應用dev鴻蒙
- 金融自助裝置核心技術近乎被國外廠商壟斷
- Linux核心模組程式設計之和裝置檔案對話(轉)Linux程式設計