Chinaunix首页 | 论坛 | 博客
  • 博客访问: 144613
  • 博文数量: 51
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 625
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-03 15:40
文章分类
文章存档

2011年(1)

2009年(50)

我的朋友

分类: 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。我们传给函数的参数baseminorcountname传递给了函数__register_chrdev_region(0, baseminor, count, name);

alloc_chrdev_region函数最后,我们看到,*dev = MKDEV(cd->major, cd->baseminor);

在内核里,用dev_t类型数据表示设备号,其中,高12位表示主设备号,低20位表示次设备号。当知道了dev_t值时,我们需要使用MAJORMINOR宏来获取相应的主次设备号。下面是这两个宏的实现:

#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驱动、内核四天班:

阅读(1397) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~