免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: chishanmingshen
打印 上一主题 下一主题

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

论坛徽章:
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
11 [报告]
发表于 2014-03-12 13:03 |只看该作者
回复 10# humjb_1983

可以大于255的,12bit的主设备号。

   

论坛徽章:
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
12 [报告]
发表于 2014-03-12 14:51 |只看该作者
回复 8# firkraag

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

        if (i == 0) {
            ret = -EBUSY;
            goto out;<---------------------如果256个主设备号对应的 chrdevs都非空,就go out了,那么根本走不到那部分检查重叠的代码啊???
        }
        major = i;
        ret = major;
    }


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
13 [报告]
发表于 2014-03-12 15:08 |只看该作者
Old interface like 'register_chrdev' may be called with the major num as '0' for the sake of dynamically allocating major num less than 256.

The code is for the major num equal to '0' situation.

论坛徽章:
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
14 [报告]
发表于 2014-03-12 17:23 |只看该作者
回复 13# firkraag

比如新接口方式已经占用了主设备号256,那么旧接口方式用此函数还能申请到主设备号1么?(接我的7楼的问题)

或者这2个接口方式是互斥的?可没看到有关的编译选项。

   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
15 [报告]
发表于 2014-03-12 17:49 |只看该作者
I guess you can't get the major num 1 when using the parameter major equal to '0' under that condition, thus will fail. They are not exclusive. I think that is a compatibile question.

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


   这是一个hash表, 你申请的主设备号会hash到冲突链表表的。


    i = major_to_index(major);

    for (cp = &chrdevs; *cp; cp = &(*cp)->next)
        if ((*cp)->major > major ||
            ((*cp)->major == major &&
             (((*cp)->baseminor >= baseminor) ||
              ((*cp)->baseminor + (*cp)->minorct > baseminor))))
            break;

266%255 = 1, 1%255=1 ; 同样是连接到chrdevs[1]这个slot的冲突链表中的。、

  楼主你有疑问的话, 你可写个模块调用注册下字符设备的主设备号,然后cat /proc/devices查看一下是主设备号的状态。
  

论坛徽章:
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
17 [报告]
发表于 2014-03-12 22:48 |只看该作者
本帖最后由 chishanmingshen 于 2014-03-12 22:51 编辑

回复 16# kiongf


就是因为hash问题才有疑问的,看我12楼啊。:wink:
(crosstool时把编译环境搞坏了,得过两天才能试。)


   

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


    你如果用register_chrdev_region()传递的是0主设备号的话, 它会直接逆序查找chrdev这个hash表,找一个free slot, 作为你申请的主设备号。
    比如说你255/254有冲突碰撞队列,恰好253没有被hash,那么就会分配253作为你申请的主设备号。
    如果所有的slot都有冲突碰撞队列,他就直接跳出,不分配主设备号。

    我也不知道为什么这样设计..

    还有, 最好用alloc_chrdev_region()来动态分配主设备号, 我在2.6.30用register_chrdev_region(0,*)来申请主设备号,注册设备到设备模型时会出现不分配dev节点的情况.

论坛徽章:
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
19 [报告]
发表于 2014-03-13 08:56 |只看该作者
回复 18# kiongf

是啊,我也是不明白这个设计,太诡异了。
register_chrdev_region(0,*)和alloc_chrdev_region()的处理是一样的啊,都是调用__register_chrdev_region,怎么会出现你说的情况,奇怪了。
我觉得反倒是alloc_chrdev_region()缺了次设备号范围检测,更容易出问题。

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP