1. 程式人生 > >淺析字元裝置驅動程式__register_chrdev_region

淺析字元裝置驅動程式__register_chrdev_region

在 2.4 的核心我們使用 register_chrdev(0, “hello”, &hello_fops) 來進行字元裝置裝置節點的分配,這種方式每一個主裝置號只能存放一種裝置,它們使用相同的 file_operation 結構體,也就是說核心最多支援 256 個字元裝置驅動程式。

在 2.6 的核心之後,新增了一個 register_chrdev_region 函式,它支援將同一個主裝置號下的次裝置號進行分段,每一段供給一個字元裝置驅動程式使用,使得資源利用率大大提升,同時,2.6 的核心保留了原有的 register_chrdev 方法。在 2.6 的核心中這兩種方法都會呼叫到 __register_chrdev_region 函式,本文將從它入手來分析核心是如何管理字元裝置驅動程式的。

static struct char_device_struct {
	struct char_device_struct *next;
	unsigned int major;
	unsigned int baseminor;
	int minorct;
	char name[64];
	struct cdev *cdev;		/* will die */
} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];

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

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

在這裡插入圖片描述