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

时间:2012-12-12 01:23:23

标签: c linux-kernel operating-system driver

我一直在为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()和{{{}}}将数据块复制到用户区域或从用户区域复制数据块有什么好处? {1}}?

1 个答案:

答案 0 :(得分:5)

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

在使用简单的ioctlread来电时,必须致电write向您的设备读取或写入数据会带来很多便利。

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

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

将数据传输保留为标准呼叫。