linux驅動開發擴充套件 字元裝置註冊詳解

2021-10-24 23:42:58 字數 3532 閱讀 8611

在2.4的核心我們使用 register_chrdev來進行字元裝置裝置驅動(file_operations)的註冊和主裝置號的分配以及兩者的繫結,這種方式每乙個主裝置號只能繫結乙個裝置驅動程式,也就是說核心最多支援 255(不一定是255個) 個字元裝置驅動程式。但並不代表它只支援255個字元裝置,因為有些字元裝置可以使用同乙個驅動程式。當兩個裝置使用同乙個驅動時,他們的主裝置號肯定相同,這是 register_chrdev 函式已經定死的,但次裝置號必須不同。也就是說主裝置號是在驅動註冊時指定的,裝置想要使用該驅動就要保證主裝置號和自己想要的驅動的主裝置號相同,其次乙個驅動有可能對應多個裝置,此時次裝置號就是用來區分使用該驅動的這些裝置的。

在2.6的核心之後,新增了乙個 register_chrdev_region 函式,它支援將同乙個主裝置號下的次裝置號進行分段,每一段供給乙個字元裝置驅動程式使用,使得資源利用率大大提公升。也就是說某個主裝置號下的部分次裝置號是在驅動註冊時指定的,裝置想要使用該驅動就要保證主裝置號和自己想要的驅動的主裝置號相同,並且次裝置號也滿足驅動註冊時指定的範圍。其次乙個驅動有可能對應多個裝置,此時次裝置號依然是用來區分使用該驅動的這些裝置的,不同的是次裝置號有了乙個特定的範圍,超出這個範圍就不在對應這個驅動程式。同時,2.6 的核心保留了原有的 register_chrdev 方法。在 2.6 的核心中這兩種方法都會呼叫到 __register_chrdev_region 函式。

include/linux/fs.h

static inline int register_chrdev(unsigned int major, const char *name,

const struct file_operations *fops)

int __register_chrdev(unsigned int major, unsigned int baseminor,

unsigned int count, const char *name,

const struct file_operations *fops)

register_chrdev

__register_chrdev

__register_chrdev_region

cdev_alloc

cdev_add

fs/char_dev.c 

int register_chrdev_region(dev_t from, unsigned count, const char *name)

return 0;

fail:

to = n;

for (n = from; n < to; n = next)

return ptr_err(cd);

}

register_chrdev_region

__register_chrdev_region 

fs/char_dev.c  

int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,

const char *name)

alloc_chrdev_region

__register_chrdev_region

通過上面的分析,可以發現老介面和新介面並沒有本質上的區別。只不過是老介面進行了單一化的封裝,使得部分功能無法得到實現;而新介面相當於沒有做封裝,故可操作性更強。 

fs/char_dev.c

static struct char_device_struct  *chrdevs[chrdev_major_hash_size];
include/linux/fs.h 

#define chrdev_major_hash_size	255
核心中的每乙個字元裝置驅動程式都由乙個 char_device_struct 結構體來描述,包含主裝置號、起始次裝置號、次裝置號個數等資訊。

核心使用 chrdevs 這個指標陣列來管理所有的字元裝置驅動程式,陣列範圍 0-255 ,看上去好像還是只支援 255 個字元裝置驅動程式,其實並不然,每乙個 char_device_struct 結構都含有乙個 next 指標,它可以指向與其主裝置號相同的其它字元裝置驅動程式,它們之間主裝置號相同,各自的次裝置號範圍相互不重疊。故每乙個char_device_struct變數代表次裝置號連續的一組裝置,並且對應乙個裝置驅動程式。

}

參考文章:

驅動 linux裝置驅動 字元裝置驅動開發

preface 前面對linux裝置驅動的相應知識點進行了總結,現在進入實踐階段!linux 裝置驅動入門篇 linux 裝置驅動掃盲篇 fedora下的字元裝置驅動開發 開發乙個基本的字元裝置驅動 在linux核心驅動中,字元裝置是最基本的裝置驅動。字元裝置包括了裝置最基本的操作,如開啟裝置 關閉...

linux核心字元裝置驅動開發

1,對驅動的理解 對於一般驅動程式來說,只需要配置控制器的暫存器就可以 但是在linux作業系統中,軟體要讓硬體辦事,就要滿足硬體的規矩,也就是按驅動框架來開發硬體驅動程式 驅動程式就要受到linux的約束,這個約束就被稱為linux驅動框架。linux的驅動框架有很多 字元裝置驅動框架 塊裝置驅動...

Linux驅動開發之字元裝置驅動例項

1 驅動標頭檔案mem dev.h ifndef memdev h define memdev h ifndef memdev major define memdev major 238 預設的mem的主裝置號 endif ifndef memdev nr devs define memdev nr...