很多时候我们不想创建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中最简单的一种设备,其系统注册过程也相对比较简单。