混杂设备动态次设备号分析
来源:互联网 发布:零售门店经营数据分析 编辑:程序博客网 时间:2024/04/30 13:41
转自http://blog.csdn.net/tianxiawuzhei/article/details/7588494
混杂设备动态次设备号分析
原文地址链接
今天看驱动源码时,发现一个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。
分析完毕。
- 混杂设备动态次设备号分析
- 混杂设备动态次设备号分析
- 混杂设备动态次设备号分析
- MISC 设备动态次设备号分析
- 混杂设备
- 混杂设备
- 混杂设备
- 混杂设备
- 混杂设备
- 混杂设备
- 字符设备次设备号
- 混杂设备驱动程序
- 混杂设备驱动程序
- 混杂设备驱动
- led驱动(混杂设备)
- miscdevice混杂设备驱动
- 关于混杂设备驱动
- 混杂设备驱动
- s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(1)
- 内核printf源代码分析.
- CentOS 安装 Codelocks
- 智能电视的未来在哪儿
- 新手上路之Hibernate(四):单向一对一关联映射(主键、唯一外键关联)
- 混杂设备动态次设备号分析
- Python 中的类和对象
- 编程之美4.5 磁带文件存放优化
- Linux驱动修炼之道-混杂设备
- s3c6410在linux下的WATCHDOG TIMER(看门狗定时器)驱动(3)
- 热键循环切换当前窗口为1/4、1/3、2/3屏幕大小
- Java中Runnable和Thread的区别
- Cocos2d-x CCScrollView demo
- 用shell脚本写的可以计算出自己来到这个世界的天数