当前位置: 代码迷 >> 驱动开发 >> 关于linux驱动的 ioctl()
  详细解决方案

关于linux驱动的 ioctl()

热度:140   发布时间:2016-04-28 11:21:25.0
求助 关于linux驱动的 ioctl()
* 根据命令类型,检测参数空间是否可以访问 */
  if (_IOC_DIR(cmd) & _IOC_READ)
  err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd));
  else if (_IOC_DIR(cmd) & _IOC_WRITE)
  err = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd));
  if (err) 
  return -EFAULT;
(_IOC_DIR(cmd) & _IOC_READ)中的‘&’是与的意思吗? 这段代码不是判断 发出的指令如果是_IOC_READ 就执行下面的语句 小弟想问的是 & 能判断出 两边的二进制 是一样的吗?


------解决方案--------------------
“&”是与的意思,(_IOC_DIR(cmd) & _IOC_READ)这段代码是:从command中取出它的“方向”(是读 是写),然后再判断是否是read;
&可以判断两边的二进制数的某一位是否一样,如:二进制数0011和0001比较(第二个数表示是要判断哪一位),0011&0001=1,说明第一个数的最后一位是1,与第二个数的最后1位相同;如果是1110和0001比较,1110&0001=0,说明第一个数的最后一位是0,与第二个数最后1位不同
------解决方案--------------------
这样理解:
如果两边是相同的二进制位为1(例如:001 & 001),则“与”后,大于0,if()条件为真,就执行;
如果两边是不相同的二进制位为1(例如:010 & 001),则“与”后,等于0,if()条件为假,就不执行;

------解决方案--------------------
很简单三,读可以再看写可以不,如果写也可以就是读写,写不可以就是只读;一个宏只判断某一位,其他位又分别留其他宏判断,互不冲突,有什么关系?
------解决方案--------------------
探讨

引用:
引用:

可是 & 两边的值是任意的啊 10 01 11 00 它都有可能 并且视频里老师说‘……

& 是C运算符按位与
宏命令 _IOC_DIR(cmd)取命令cmd的方向字段,只有4种可能:读,写,双向,不读写;用2比特表示。
_IOC_READ占1比特,_IOC_……