幻数使用说明

幻数使用说明
在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情。 因为设备都是特定的,这里也没法说。关键在于怎样组织命令码,因为在ioctl中命令码是唯一联系用户程序命令和驱动程序支持的途径 。 命令码的组织是有一些讲究的,因为我们一定要做到命令和设备是一一对应的,利用幻数这种特殊组织命令的方式,主要就是避免将正确的命令发给错误的设备,或者是把错误的命令发给正确的设备,或 者是把错误的命令发给错误的设备。这些错误都会导致不可预料的事情发生,而当程序员发现了这些奇怪的事情的时候,再来调试程序查找错误,那将是非常困难的 事情。所以在Linux核心中是这样定义一个命令码的: 
____________________________________ | 设备类型 | 序列号 | 方向 |数据尺寸  | |-----------|--------|------|----------| | 8 bit      |   8 bit  |2 bit |8~14 bit | |-----------|---------|------|----------|
这样一来, 一个命令就变成了一个整数形式的命令码; 但是命令码非常的不直观,所以Linux Kernel中提供了一些宏。 这些宏可根据便于理解的字符串生成命令码,或者是从命令码得到一些用户可以理解的字符串以标明这个命令对应的设备类型、设备序列号、数据传送方向和数据传输尺寸。
 
例子:
#define HELLO_MAGIC 'k'
#define HELLO_CMD1    _IO(HELLO_MAGIC,0x1c) #define HELLO_CMD2    _IO(HELLO_MAGIC,0x1d) 
其中'k'为幻数,要按照Linux内核的约定方法为驱动程序选择ioctl编号,应该首先看看/usr/include/asm/ioctl.h和Documentation/ioctl-number.txt这两个文件,下面是ioctl.h的部分内容:
_IO(type, nr)
       用于构造无参数的命令编号; _IOR(type, nr, datatype)
       用于构造从驱动程序中读取数据的命令编号; _IOW(type, nr, datatype)        用于写入数据的命令; _IOWR(type, nr, datatype)        用于双向传输。
 
注意对幻数的编号千万不能重复定义,如ioctl-number.txt已经说明‘k'的编号已经被占用的范围为:




https://wenku.baidu.com/view/c1d60784770bf78a64295474.html
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值