编写字符设备驱动程序,ioctl()与普通的读/写?

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()

pax*_*blo 5

ioctl 应该仅用于内核默认情况下未提供的那些操作。

ioctl使用简单readwrite呼叫时,必须打电话来读取或写入设备中的数据,这大大简化了您的操作。

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

通过各种方式ioctl将命令传输到设备驱动程序(或从设备驱动程序获取非数据信息,如当前参数或统计信息)(替代方法是在数据中使用一些复杂的转义方案,例如AT为调制解调器设置的命令或显示我的年龄)的CTRL-D苹果[]磁盘子系统,这很少见。

将数据传输留给标准呼叫。