首页 > 代码库 > 06 字符设备(二)

06 字符设备(二)

上一节字符驱动不足:

(1)在注册设备号的时候,我们是指定一个特定的主设备号,如果设备号已经注册了就会出现注册失败的情况。

改善:采用动态注册,让Linux内核自动分配一个未使用的设备号。

(2)每次加载完模块后,必须手动创建设备节点,很麻烦。

改善:注册完设备后,让Linux系统自动在/dev目录下创建设备节点。

(3)字符设备的读写函数接口,没有实际的数据流向。

改善:xxx_read函数接口将buffer内容拷贝到用户空间,xxx_write函数接口将用户空间传下的数据,写到buffer里面。

(4)char_device是在data段分配的,占用很大空间。

改善:char_device的空间在Linux内核的堆区分配。

一、动态注册设备号

/**
* alloc_chrdev_region() - register a range of char device numbers
* @dev: output parameter for first assigned number
* @baseminor: first of the requested range of minor numbers
* @count: the number of minor numbers required
* @name: the name of the associated device or driver
*
* Allocates a range of char device numbers. The major number will be
* chosen dynamically, and returned (along with the first minor number)
* in @dev. Returns zero or a negative error code.
*/
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)

功能:让系统自动分配一个设备号,并注册

参数:

@dev      用来获得系统分配的设备号

@baseminor     第一个次设备号

@count     次设备号个数

@name     设备的名字

返回值:

成功返回0,失败返回负的错误码。

二、自动创建设备节点

06 字符设备(二)