zoukankan      html  css  js  c++  java
  • 混杂设备动态次设备号分析【转】

    本文转载自:http://blog.csdn.net/yongan1006/article/details/6778285

    今天看驱动源码时,发现一个MISC_DYNAMIC_MINOR宏,于是分析了一下内核源码。先粘出源码。在misc_register函数中,有如下语句:

           if (misc->minor == MISC_DYNAMIC_MINOR) {

                  int i = DYNAMIC_MINORS;

                  while (--i >= 0)

                         if ( (misc_minors[i>>3] & (1 << (i&7))) == 0)

                                break;

                  if (i<0) {

                         mutex_unlock(&misc_mtx);

                         return -EBUSY;

                  }

                  misc->minor = i;

           }

           if (misc->minor < DYNAMIC_MINORS)

                  misc_minors[misc->minor >> 3] |= 1 << (misc->minor & 7);

           dev = MKDEV(MISC_MAJOR, misc->minor);

    宏定义MISC_DYNAMIC_MINOR=255,DYNAMIC_MINORS=64。

    misc_minors定义static unsigned char misc_minors[DYNAMIC_MINORS / 8];是一个char型的数组。代码的关键是看懂(misc_minors[i>>3] & (1 << (i&7))) == 0。为了方便分析,本人写了一个分析i与i&7的值的程序

    #include <iostream.h>

    void main()

    {

           int i=64;

           int j;

           int l;

           while(--i>=0)

           {

                  j=i>>3;

                  l=1<<(i&7);

                  cout<<"j's valule is: "<<j<<endl;

                  cout<<"l's valule is: "<<l<<endl;

                  cout<<"i's valule is: "<<i<<endl;

           }

    }

    运行结果:

    ……

    ……

           基于以上运行结果我们可以看出:

    j的值是从7递减到0,j每减一个值,l的值循环一次出现128,64,32,16,8,4,2,1

    i的值则是从63一直减到0。

    所以我们可以得出以下几个结论

    1.       misc_minors[i>>3]这个char型数组有8个成员,每个成员是一个8位的数(因为j是从7减到0)

    2.       (1 << (i&7))),当i减小1时,(1 << (i&7)))就向右移1位。即出现128,64,32,16,8,4,2,1的情况

    3.       misc_minors数组成员与i值有对应关系,即misc_minors[7]对应63,62,61……56

    misc_minors[6]对应55,54,……48。以些类推。因为misc_minors的成员是8位的数,每一个成员对应8个minors,所以很容易这样联想:misc_minors成员的每一位标记一个次设备号(有没有使用过)。

    4.       (misc_minors[i>>3] & (1 << (i&7))) == 0意思就是将misc_minors数组中8个成员的每个成员的每一位遍历一遍,看是否为0

    看懂了(misc_minors[i>>3] & (1 << (i&7))) == 0的意思后往下看,如果条件成立,就—i,如果是就将i赋给minor。这就说明,此前的联想是正确的。位是0就代表没有使用过这个次设备号,位1是代表使用过这个次设备号。所以在下面的代码中还可以看到,如果得到了一个次设备号后,就要马上将代表这个次设备号的位标记为1。但是使用MISC_DYNAMIC_MINOR这个宏有一个限制:你的次设备号不会超过63。

    分析完毕。

  • 相关阅读:
    js 日期2015/12/22/16/45替换2015-12-22 16:45格式
    正则匹配多行内容
    js fs read json 文件json字符串无法解析
    未能加载文件或程序集“Enyim.Caching”或它的某一个依赖项。未能验证强名称签名
    二叉树、多叉树子路径遍历
    p点到(a,b)点两所在直线的垂点坐标及p点是否在(a,b)两点所在直线上
    System.Net.Sockets.Socket SendAsync System.ObjectDisposedException: Cannot access a disposed object.
    一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535”
    如何用 PyCharm 调试 scrapy 项目
    c或c++的网络库
  • 原文地址:https://www.cnblogs.com/zzb-Dream-90Time/p/6255551.html
Copyright © 2011-2022 走看看