免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2916 | 回复: 18
打印 上一主题 下一主题

[内核入门] 关于设备号的疑问。。。 [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-03-10 22:51 |只看该作者 |倒序浏览
本帖最后由 chishanmingshen 于 2014-03-12 14:46 编辑

from 3.7
  1. static struct char_device_struct *
  2. __register_chrdev_region(unsigned int major, unsigned int baseminor,
  3.                int minorct, const char *name)
  4. {
  5.     struct char_device_struct *cd, **cp;
  6.     int ret = 0;
  7.     int i;

  8.     cd = kzalloc(sizeof(struct char_device_struct), GFP_KERNEL);
  9.     if (cd == NULL)
  10.         return ERR_PTR(-ENOMEM);

  11.     mutex_lock(&chrdevs_lock);

  12.     /* temporary */
  13.     if (major == 0) {
  14.         for (i = ARRAY_SIZE(chrdevs)-1; i > 0; i--) {
  15.             if (chrdevs[i] == NULL)<----------
  16.                 break;<--------------------------此2行为何不是检查是否主次设备号的范围是否重叠?
  17.         }

  18.         if (i == 0) {
  19.             ret = -EBUSY;
  20.             goto out;
  21.         }
  22.         major = i;
  23.         ret = major;
  24.     }

  25.    cd->major = major;
  26.     cd->baseminor = baseminor;
  27.     cd->minorct = minorct;
  28.     strlcpy(cd->name, name, sizeof(cd->name));

  29.     i = major_to_index(major);

  30.     for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next)
  31.         if ((*cp)->major > major ||
  32.             ((*cp)->major == major &&
  33.              (((*cp)->baseminor >= baseminor) ||
  34.               ((*cp)->baseminor + (*cp)->minorct > baseminor))))
  35.             break;

  36.     /* Check for overlapping minor ranges.  */
  37.     if (*cp && (*cp)->major == major) {
  38.         int old_min = (*cp)->baseminor;
  39.         int old_max = (*cp)->baseminor + (*cp)->minorct - 1;
  40.         int new_min = baseminor;
  41.         int new_max = baseminor + minorct - 1;

  42.         /* New driver overlaps from the left.  */
  43.         if (new_max >= old_min && new_max <= old_max) {
  44.             ret = -EBUSY;
  45.             goto out;
  46.         }

  47.         /* New driver overlaps from the right.  */
  48.         if (new_min <= old_max && new_min >= old_min) {
  49.             ret = -EBUSY;
  50.             goto out;
  51.         }
  52.     }


  53.     cd->next = *cp;
  54.     *cp = cd;
  55.     mutex_unlock(&chrdevs_lock);
  56.     return cd;
  57. out:
  58.     mutex_unlock(&chrdevs_lock);
  59.     kfree(cd);
  60.     return ERR_PTR(ret);
  61. }



复制代码
求指点,谢谢!

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2014-03-11 09:14 |只看该作者
这里的意思是:当入参major为0时,表示请求动态分配一个主设备号,此时需要从设备列表中的末尾项开始继续向前寻找一个尚未使用的主设备号,没有找到就返回错误。
这段代码目的是找到一个尚未使用的主设备号。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2014-03-11 19:19 |只看该作者
回复 2# humjb_1983

我的意思是为何不检查范围重叠。
比如:已分配出去主设备号1,次设备号1。此时调用此函数来申请主设备号1,次设备号2,为何不行?


   

论坛徽章:
0
4 [报告]
发表于 2014-03-11 20:36 |只看该作者
本帖最后由 黎明748 于 2014-03-11 20:44 编辑

回复 3# chishanmingshen
这里没有说到次设备号吧。内核只申请分配主设备号。主设备号表示设备对应的驱动程序;次设备号由内核使用,用于正确确定设备文件所指的设备。主设备1已被申请就不能再申请了。所以不用检查


   

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
5 [报告]
发表于 2014-03-11 22:50 |只看该作者
回复 1# chishanmingshen


    这里只是申请主设备号吧。就只是检测chrdevs这个主设备号hash表有没有已经注册了这个主设备号,或者为0时就从chrdevs最后找一个空的slot作为主设备分配。
    至于次设备号,我记得是在cdev_init()/cdev_addd()才正式的申请,并且在cdev_map中登记。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
6 [报告]
发表于 2014-03-12 08:32 |只看该作者
同意楼上两位的看法,这里只涉及主设备号的申请。

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2014-03-12 09:15 |只看该作者
没错,应该仅跟主设备号有关。。。

1. 对于某一个具体驱动,是不是调用alloc_chrdev_region(),只能最多1次?

2.如果register_chrdev_region()已将256的主设备号申请了,难道alloc_chrdev_region()就不能申请1的主设备号了?
256%255=1%255

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
8 [报告]
发表于 2014-03-12 09:17 |只看该作者
      /* Check for overlapping minor ranges.  */
      if (*cp && (*cp)->major == major) {
                 int old_min = (*cp)->baseminor;
                 int old_max = (*cp)->baseminor + (*cp)->minorct - 1;
                 int new_min = baseminor;
                 int new_max = baseminor + minorct - 1;

                /* New driver overlaps from the left.  */
                if (new_max >= old_min && new_max <= old_max) {
                        ret = -EBUSY;
                        goto out;
                }

                /* New driver overlaps from the right.  */
                if (new_min <= old_max && new_min >= old_min) {
                        ret = -EBUSY;
                        goto out;
                }
        }

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
9 [报告]
发表于 2014-03-12 10:35 |只看该作者
回复 1# chishanmingshen

自动分配时直接找一个未被使用的主设备号,自然不存在次设备号冲突的情况!

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
10 [报告]
发表于 2014-03-12 11:21 |只看该作者
多次调用应该也没关系吧~
256不可能吧,总共好像就255
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP