写入字符设备驱动程序,ioctl()与正常读/写?

写入字符设备驱动程序,ioctl()与正常读/写?,c,linux-kernel,operating-system,driver,C,Linux Kernel,Operating System,Driver,我一直在尝试为linux内核编写一个字符设备模块,结果有点让人困惑 我在网上看到有人谈论使用ioctl()将命令/数据从用户程序传输到内核空间,反之亦然。但是,用file\u operations struct // structure containing callbacks static struct file_operations fops = { .read = dev_read, // address of dev_read .open = dev_open, //

我一直在尝试为linux内核编写一个字符设备模块,结果有点让人困惑

我在网上看到有人谈论使用
ioctl()
将命令/数据从用户程序传输到内核空间,反之亦然。但是,用
file\u 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
};

使用
ioctl()
而不是使用在
dev_read()
dev_write()
中定义的函数,只需使用
copy_to_user()
copy_from_user()将数据块复制到/从用户土地上,有什么好处

ioctl
应仅用于内核中默认不提供的操作

在使用简单的
read
write
调用时,必须调用
ioctl
来向设备读取或写入数据,这会大大降低您的易用性

所谓非标准操作,我指的是在终端设备驱动程序中设置自动ASCII/EBCDIC转换,或从DVD块设备中弹出磁盘,或修改串行通信设备的串行通信参数(波特率、停止位等)

务必使用
ioctl
将命令传输到设备驱动程序(或从设备驱动程序获取非数据信息,如当前参数或统计数据)(另一种方法是在数据中使用一些复杂的转义方案,如调制解调器的
AT
命令集或苹果的CTRL-D(这显示了我的年龄))[磁盘子系统,这很少是漂亮的


将数据传输留给标准调用。

为什么不能使用读/写来执行非标准操作?您可以通过读/写轻松地传输命令/参数。我根本看不出ioctl存在的原因?@John,职责基本上是分离的。如果在单个通道上混合数据和控制,那么保持它们独立是件麻烦事arate,特别是对于异步操作。它与用于控制传输的两个FTP TCP会话没有什么不同。数据只在一个会话上传输,控制在另一个会话上,允许轻松分离带外信息。想想如果您的命令都以
xyzy
开头,并且设备驱动程序截获了se在
write
调用中。现在,当您想将字符串
xyzy
发送到实际设备(如终端)本身时会发生什么情况?啊,我想这更有意义,对于我的使用,我可以组合数据/控件,因为我有一个非常小的控件集和一个有限(非负)的数据一组值,但如果我的值使用了完整的范围,则不起作用。