分类: LINUX
2009-07-03 13:25:05
我们看一下alloc_chrdev_region()的内核源码:
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)
{
struct char_device_struct *cd;
cd = __register_chrdev_region(0, baseminor, count, name);
if (IS_ERR(cd))
return PTR_ERR(cd);
*dev = MKDEV(cd->major, cd->baseminor);
return 0;
}
可以想象,在这个注册设备号的函数中,有一个比较重要的数据结构char_device_struct的指针cd。我们传给函数的参数baseminor、count和name传递给了函数__register_chrdev_region(0, baseminor, count, name);
在alloc_chrdev_region函数最后,我们看到,*dev = MKDEV(cd->major, cd->baseminor);
在内核里,用dev_t类型数据表示设备号,其中,高12位表示主设备号,低20位表示次设备号。当知道了dev_t值时,我们需要使用MAJOR和MINOR宏来获取相应的主次设备号。下面是这两个宏的实现:
#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
其定义在include/linux/Kdev_t.h中。其中,也同时定义了宏所依赖的偏移和掩码:
#define MINORBITS 20
#define MINORMASK ((1U << MINORBITS) - 1)
那么,当知道主次设备号时,我们就要用MKDEV宏来获取dev_t类型的变量,MKDEV宏的定义如下:
#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))
相信你能看懂上面的宏定义,不赘述。
嵌入式精品课程一览:
最新嵌入式就业实训班请参考:
嵌入式Linux暑期实训班:
嵌入式Linux驱动、内核四天班: