linux 幻数的使用
幻数使用说明
在驱动程序中实现的ioctl函数体内,实际上是有一个switch{case}结构,每一个case对应一个命令码,做出一些相应的操作。怎么实现这些操作,这是每一个程序员自己的事情。因
linux 幻数的使用
幻数使用说明
在驱动程序中实现的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/-,:
_IO(type, nr)
用于构造无参数的命令编号;
_IOR(type, nr, datatype)
用于构造从驱动程序中读取数据的命令编号;
_IOW(type, nr, datatype)
用于写入数据的命令;
_IOWR(t
linux 幻数的使用 来自淘豆网m.daumloan.com转载请标明出处.