在linux内核中用dev_t来保存设备的编号, dev_t 是个32位数值12位为主设备号, 20位次设备号, 想要获得dev_t的设备号最好使用给定的宏MAJOR(dev_t dev), MINOR(dev_t dev).
相反用MKDEV(int major, int minor)来获取dev_t类型的值.
如果我们在明确知道设备编号的时候可以使用register_chrdev_region函数来分配编号,否则最好使用动态分配函数alloc_chrdev_region(dev_t *dev, minor, count, char *name).
不论采用上述那种分配方法都用unregister_chrdev_region(dev_t, unsigned int count)来释放.
示例代码:
静态分配设备号:
static dev_t dev; static int __init test_init(void) { int err; /* 静态分配设备号 *? dev = MKDEV(240, 0); err = register_chrdev_region(dev, 1, "test"); if (err) goto fail_alloc; printk(KERN_INFO "Register success\n"); return 0; fail_alloc: unregister_chrdev_region(dev, 1); return err; } static void __exit test_exit(void) { unregister_chrdev_region(dev, 1); }动态分配设备号:
static dev_t dev; static int __init test_init(void) { int err; /* 动态分配 */ err = alloc_chrdev_region(&dev, 0, 1, "test"); if (err) goto fail_alloc; printk(KERN_INFO "Register success\n"); return 0; fail_alloc: unregister_chrdev_region(dev, 1); return err; } static void __exit test_exit(void) { unregister_chrdev_region(dev, 1); }若要查看设备编号查看/proc/devices.
上述操作只是分配了设备编号并没有告诉内核这些设备编号要做什么.