我一直在为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}}?
答案 0 :(得分:5)
ioctl
只应用于内核中默认未提供的那些操作。
在使用简单的ioctl
或read
来电时,必须致电write
向您的设备读取或写入数据会带来很多便利。
通过非标准操作,我的意思是在终端设备驱动程序中设置自动ASCII / EBCDIC转换,或从DVD块设备中弹出磁盘,或修改串行通信参数(波特率,停止位等)串行通信设备。
一定要使用ioctl
将命令传输到(或从中获取非数据信息,如当前参数或统计信息)设备驱动程序(另一种方法是在数据中使用一些复杂的转义方案,如{ {1}}调制解调器的命令设置或(这显示我的年龄)Apple的[kbd> CTRL-D ] [磁盘子系统,这很少漂亮。
将数据传输保留为标准呼叫。