linux核心cdev init系列函式

2021-06-05 01:44:10 字數 1247 閱讀 6285

核心中每個字元裝置都對應乙個 cdev 結構的變數,下面是它的定義:

linux-2.6.22/include/linux/cdev.h

基本相同

struct cdev ;

乙個 cdev 一般它有兩種定義初始化方式:靜態的和動態的。

靜態記憶體定義初始化:

struct cdev my_cdev;

cdev_init(&my_cdev,&fops);

my_cdev.owner = this_module;

動態記憶體定義初始化:

struct cdev *my_cdev = cdev_alloc();

my_cdev->ops = &fops;

my_cdev->owner = this_module;

兩種使用方式的功能是一樣的,只是使用的記憶體區不一樣,一般視實際的資料結構需求而定。

下面貼出了兩個函式的**,以具體看一下它們之間的差異。

structcdev *cdev_alloc(void)

return p;

}void cdev_init(struct cdev *cdev, const struct file_operations*fops)

由此可見,兩個函式完成都功能基本一致,只是 cdev_init() 還多賦了乙個 cdev->ops的值。

初始化 cdev 後,需要把它新增到系統中去。為此可以呼叫 cdev_add() 函式。傳入 cdev結構的指標,起始裝置編號,以及裝置編號範圍。

intcdev_add(struct cdev *p, dev_t dev, unsigned count)

關於 kobj_map() 函式就不展開了,我只是大致講一下它的原理。核心中所有都字元裝置都會記錄在乙個 kobj_map 結構的cdev_map 變數中。這個結構的變數中包含乙個雜湊表用來快速訪問所有的物件。kobj_map() 函式就是用來把字元裝置編號和cdev 結構變數一起儲存到 cdev_map 這個雜湊表裡。當後續要開啟乙個字元裝置檔案時,通過呼叫 kobj_lookup()函式,根據裝置編號就可以找到 cdev 結構變數,從而取出其中的 ops 字段。

當乙個字元裝置驅動不再需要的時候(比如模組解除安裝),就可以用 cdev_del() 函式來釋放 cdev占用的記憶體。

void cdev_del(struct cdev *p)

其中 cdev_unmap() 呼叫 kobj_unmap() 來釋放 cdev_map 雜湊表中的物件。kobject_put()釋放 cdev 結構本身。

Linux字元裝置驅動之cdev init 系列

字元裝置驅動之cdev init 系列函式 1.核心中每個字元裝置都對應乙個cdev 結構的變數,下面是它的定義 linux 2.6.22 include linux cdev.h struct cdev 1 kobj 是乙個嵌入在該結構中的核心物件。它用於該資料結構的一般管理。2 owner 指向...

cdev alloc和cdev init 的使用

1.核心結構體定義 struct cdev 2.兩種定義初始化方式 靜態的 在stack中生成物件 和動態的 在heap中生成物件 靜態記憶體定義初始化 struct cdev my cdev 變數在stack中 cdev init my cdev,fops my cdev.owner this m...

Linux核心 了解Linux核心搶占

目錄 無強制搶占 可搶占核心 自願核心搶占 完全實時搶占 在配置linux核心時,我們可以設定一些影響系統行為的引數。您可以使用不同的優先順序,排程類和搶占模型。了解並選擇正確的引數非常重要。在這篇文章中,我將介紹不同的搶占模型,以及每種模型如何影響使用者和核心行為 如果配置核心 使用make me...