4

我一直在为 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
};

ioctl()使用而不是使用定义的函数dev_read()以及dev_write()简单地将数据块复制到用户区/从用户区复制数据块copy_to_user()有什么好处copy_from_user()

4

1 回答 1

6

ioctl应该只用于内核默认不提供的那些操作。

在使用简单或调用时,必须调用ioctl以读取或写入数据到您的设备会大大降低您的易用性。readwrite

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

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

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

于 2012-12-12T01:30:06.793 回答