0xdeadbeef level
获赞
6
粉丝
0
关注
0
看过 TA
3
广东工业大学
2016
C++
IP属地:未知
键盘为地,代码为种
私信
关注
2016-09-05 23:54
广东工业大学 C++
在调用ioctl的时候。已经指定了一个文件描述符了吗,也就是说,已经指定了要用某个设备文件节点本身驱动中提供的ioctl方法,但是为什么在设定CMD命令的时候,还要用这么多的宏定义来制定CMD,网上书上说是与其他设备驱动中的ioctl的CMD命令进行区分。这个意义在哪儿?我知道肯定有意义,但是就目前来看我不懂为什么要这样做。 明明用户做ioctl调用的时候就指定了文件描述符了,为啥还要"与其他设备的CMD进行区别"????
牛客423021号:我觉得:1 内核开发者可以使用宏来定义新的命令,这个命令可以避免别的预留的命令(在VFS层使用的,比如说你提到的0,1,2这些)产生冲突。 2 使用宏比使用直接的数字更容易不出错,无论是内核的开发者,还是这个设备的使用者,这个跟其他系统调用如kill,signal这些是一个道理。 3 的确你自己定义的文件,随便你写什么命令都可以,与其他类型的文件冲突也没关系,只要不与VFS层的冲突就可以了,也不需要专门定义宏。 4 还要考虑到linux不只有x86一个平台的,同一套iotcl需要跟不同的处理器兼容,直接使用数字的话在处理诸如大小端这类问题很麻烦,而且有些命令在不同的平台上值是不一样的(如_IOC_NONE在sparc上是1,而一般为0),为什么要这样取值我也不知道,详细可以研究相关的处理器架构或者ioctl代码。其实你看看这些宏的定义就清楚了。 5 最后摘抄一段源码的注释: /* ioctl command encoding: 32 bits total, command in lower 16 bits,   5  * size of the parameter structure in the lower 14 bits of the   6  * upper 16 bits.   7  * Encoding the size of the parameter structure in the ioctl request   8  * is useful for catching programs compiled with old versions   9  * and to avoid overwriting user space outside the user buffer area.  10  * The highest 2 bits are reserved for indicating the ``access mode''.  11  * NOTE: This limits the max parameter size to 16kB -1 !  12  */ /*   5  * The original linux ioctl numbering scheme was just a general   6  * "anything goes" setup, where more or less random numbers were   7  * assigned.  Sorry, I was clueless when I started out on this.   8  *   9  * On the alpha, we'll try to clean it up a bit, using a more sane  10  * ioctl numbering, and also trying to be compatible with OSF/1 in  11  * the process. I'd like to clean it up for the i386 as well, but  12  * it's so painful recognizing both the new and the old numbers..  13  */
0 点赞 评论 收藏
分享
关注他的用户也关注了:
牛客网
牛客企业服务