Joh*_*acs 3 c operating-system driver linux-kernel
我一直在为Linux内核编写字符设备模块,这让我感到困惑。
我在网上看到有人谈论使用ioctl()命令从用户程序向内核空间传输命令/数据,反之亦然。但是很多事情似乎已经过时了,file_operations struct
// structure containing callbacks
static struct file_operations fops =
{
.read = dev_read, // address of dev_read
.open = dev_open, // address of dev_open
.write = dev_write, // address of dev_write
.release = dev_rls, // address of dev_rls
};
Run Code Online (Sandbox Code Playgroud)
有什么好处是没有使用ioctl(),而不是使用在定义的功能dev_read()和dev_write()简单地数据的块复制到/来自用户的土地copy_to_user()和copy_from_user()?
ioctl 应该仅用于内核默认情况下未提供的那些操作。
ioctl使用简单read或write呼叫时,必须打电话来读取或写入设备中的数据,这大大简化了您的操作。
通过非标准操作,我的意思是诸如在终端设备驱动程序中设置自动ASCII / EBCDIC转换,或从DVD块设备弹出磁盘,或修改串行通信设备的串行通信参数(波特率,停止位等) 。
通过各种方式ioctl将命令传输到设备驱动程序(或从设备驱动程序获取非数据信息,如当前参数或统计信息)(替代方法是在数据中使用一些复杂的转义方案,例如AT为调制解调器设置的命令或显示我的年龄)的CTRL-D苹果[]磁盘子系统,这很少见。
将数据传输留给标准呼叫。