主设备号标识设备对应的驱动程序。次设备号由内核使用,用于正确确定设备文件所指的设备。
在内何种,dev_t类型(中定义)用来保存设备编号,包括主、次设备号,它是一个32位的数,12位表示主设备号,20位表示次设备号。
一般使用中定义的宏来获得主设备号和次设备号:
MAJOR(dev_t dev);
MINOR(dev_v dev);
反之,要将主次设备号转换为dev_t类型,使用
MKDEV(int major,int minor)
在建立一个字符设备之前,驱动程序首先要做的是获得一个或多个设备编号。完成该工作的必要函数是register_chrdev_region,该函数在中声明。
int register_chrdev_region(dev_t first,unsigned int count,char *name); //获得设备编号
int alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name); //分配主设备号
void unregister_chrdev_region(dev_t first,unsigned int count); //释放设备编号
|
分配主设备号的最佳方式是:默认采用动态分配,同时保留在加载甚至编译时指定主设备号的余地。
下面是scull.c中用来获取主设备号的代码:
if(scull_major){ dev=MKDEV(scull_major,scull_minor); result=regist_chrdev_region(dev,scull_nr_devs,"scull"); }else{ result=alloc_chrdev_region(&dev,scull_minor,scull_nr_devs,"scull"); scull_major=MAJOR(dev); } if(result<0){ printk(KERN_WARNING "scull:can't get major %d\n",scull_major); return result; }
|
阅读(559) | 评论(0) | 转发(0) |