字元裝置的核心結構體 kobj map 結構

2021-07-24 23:48:23 字數 1922 閱讀 8287

《深入linux裝置驅動程式核心機制》第2章字元裝置驅動程式,本章描述了字元裝置驅動程式核心框架的技術細節。本節為大家介紹字元裝置的註冊。

2.5  字元裝置的註冊

前面已經討論了字元裝置物件的分配、初始化及裝置號等概念,在乙個字元裝置初始化階段完成之後,就可以把它加入到系統中,這樣別的模組才可以使用它。把乙個字元裝置加入到系統中所需呼叫的函式為cdev_add,它在linux原始碼中的實現如下:

<

fs/char_dev.c

>

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

其中,引數p為要加入系統的字元裝置物件的指標,dev為該裝置的裝置號,count表示從次裝置號開始連續的裝置數量。

cdev_add的核心功能通過kobj_map函式來實現,後者通過操作乙個全域性變數cdev_map來把裝置(*p)加入到其中的雜湊鍊錶中。cdev_map的定義如下:

<

fs/char_dev.c

>

static struct kobj_map *cdev_map;  

這是乙個struct kobj_map指標型別的全域性變數,在linux系統啟動期間由chrdev_init函式負責初始化。struct kobj_map的定義如下:

<

drivers

/base/map.c

>

struct kobj_map  *probes[255];  

struct mutex *lock;  

};  

kobj_map函式中雜湊表的實現原理和前面註冊分配裝置號中的幾乎完全一樣,通過要加入系統的裝置的主裝置號major(major=major(dev))來獲得probes陣列的索引值i(i = major % 255),然後把乙個型別為struct probe的節點物件加入到probes[i]所管理的鍊錶中,如圖2-6所示。其中struct probe所在的矩形塊中的深色部分是我們重點關注的內容,記錄了當前正在加入系統的字元裝置物件的有關資訊。其中,dev是它的裝置號,range是從次裝置號開始連續的裝置數量,data是一void *變數,指向當前正要加入系統的裝置物件指標p。圖2-6展示了兩個滿足主裝置號major % 255 = 2的字元裝置通過呼叫cdev_add之後,cdev_map所展現出來的資料結構狀態。

圖2-6  通過cdev_add向系統中加入裝置

所以,簡單地說,裝置驅動程式通過呼叫cdev_add把它所管理的裝置物件的指標嵌入到乙個型別為struct probe的節點之中,然後再把該節點加入到cdev_map所實現的雜湊鍊錶中。

對系統而言,當裝置驅動程式成功呼叫了cdev_add之後,就意味著乙個字元裝置物件已經加入到了系統,在需要的時候,系統就可以找到它。對使用者態的程式而言,cdev_add呼叫之後,就已經可以通過檔案系統的介面呼叫到我們的驅動程式,本章稍後將會詳細描述這一過程。

不過在開始檔案系統如何通過cdev_map來使用驅動程式提供的服務這個話題之前,我們要來看看與cdev_add相對應的另乙個函式cdev_del。其實光通過這個函式名,讀者想必也想到這個函式的作用了:在cdev_add中我們動態分配了struct probe型別的節點,那麼當對應的裝置從系統中移除時,顯然需要將它們從鍊錶中刪除並釋放節點所占用的記憶體空間。在cdev_map所管理的鍊錶中查詢對應的裝置節點時使用了裝置號。cdev_del函式的實現如下:

<

fs/char_dev.c

>

void cdev_del(struct cdev *p)  

對於以核心模組形式存在的驅動程式,作為通用的規則,模組的解除安裝函式應負責呼叫這個函式來將所管理的裝置物件從系統中移除。

Linux的核心結構詳述

三 linux核心源 的目錄結構 如下圖所示,linux核心只是linux作業系統一部分。向上層提供系統呼叫介面。向下層,它管理系統的所有硬體裝置。其核心功能就是 管理硬體裝置,用程式使用。而現代計算機 無論是pc還是嵌入式系統 的標準組成,就是cpu memory 記憶體和外存 輸入輸出裝置 網路...

匯智學堂 Spring的核心結構(3)

該模組由web websocket,servlet和portlet等模組組成。1 web模組提供了面向web開發的整合功能。2 websocket模組提供了面向websocket開發的整合功能。3 servlet模組 也被稱為springmvc模組 包含spring的model view contr...

Linux字元裝置驅動 cdev結構體day00

day00 摘要 linux字元裝置驅動cdev結構體 1.cdev結構體 描述乙個字元裝置 定義 struct 1 dev t定義裝置號,32位,12位主裝置號,20位次裝置號.2 使用巨集major,minor可以獲得裝置主次號 major dev t dev 主裝置號 minor dev t ...