Linux 中字符设备的注册(3)

很多时候我们不想创建Misc字符设备,想要自己创建一个字符设备类,然后再创建该设备类的字符设备,那么整个创建过程可以描述如下:

1,调用register_chrdev_region函数注册设备号区间

2,调用cdev_alloc函数分配一个字符设备

3,调用cdev_add函数添加内核字符设备

4,调用device_create函数通知udev创建设备节点,并且注册到sysfs中。

register_chrdev_region函数用来分配设备号。在linux系统中维护了一个char_device的Hash表,每个Major占用一个Hash项。通过register_chrdev_region函数就是向全局的char_device Hash表注册设备号。该函数说明如下:

int register_chrdev_region(dev_t from, unsigned count, const char *name)
{
 struct char_device_struct *cd;
 dev_t to = from + count;
 dev_t n, next;
 
 for (n = from; n < to; n = next) {
next = MKDEV(MAJOR(n)+1, 0); //一个Major设备类最多可以容纳1M个Minor设备
if (next > to)
next = to; //取最小设备号
cd = __register_chrdev_region(MAJOR(n), MINOR(n),
 next - n, name); //注册设备号区间
if (IS_ERR(cd))
 goto fail;
 }
 return 0;
fail:
to = n;
 for (n = from; n < to; n = next) {
next = MKDEV(MAJOR(n)+1, 0);
 kfree(__unregister_chrdev_region(MAJOR(n), MINOR(n), next - n));
 }
 return PTR_ERR(cd);
}

当设备号区间分配完成之后,通过cdev_alloc()函数分配一个内核字符设备,然后通过cdev_add函数将该字符设备注册到内核cdev_map->probes[]数组中,至此,内核的字符设备创建完毕。但是,此时,应用层还无法看到字符设备节点,因此,可以调用device_create函数通知udev去创建设备节点,并且将设备添加到sysfs系统树中。至此,应用层可以通过设备节点访问字符设备了。

字符设备是Linux中最简单的一种设备,其系统注册过程也相对比较简单。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/f229cff9d05b65220123049b1d5cd3a7.html