关闭

ioctl 与unlocked_ioctl之间的转换

标签: ioctlunlocked_ioctl
433人阅读 评论(0) 收藏 举报
分类:

2.6.36后 file_operations结构体中由原来的ioctl变成现在的unlocked_ioctl,其函数原型为:long (*unlocked_ioctl)(struct *filp,unsigned int cmd,unsigned long arg)

kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl :
ioctl,unlocked_ioctl和compat_ioctl
现在只有unlocked_ioctl和compat_ioctl 了


 

在kernel 2.6.36 中已经完全删除了struct file_operations 中的ioctl 函数指针,取而代之的是unlocked_ioctl 。

这个指针函数变了之后最大的影响是参数中少了inode , 不过这个不是问题,因为用户程序中的ioctl对应的系统调用接口没有变化,所以用户程序不需要改变,一切都交给内核处理了,如果想在unlocked_ioctl中获得inode 等信息可以用如下方法:
struct inode *inode = file->f_mapping->host;
struct block_device *bdev = inode->i_bdev;
struct gendisk *disk = bdev->bd_disk;
fmode_t mode = file->f_mode;

和int (*ioctl) (struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)相比
compat_ioctl少了inode参数, 可以通过filp->f_dentry->d_inode方法获得。  

区别:

ioctl 和 unlock_ioctl

ioctl 不会lock_kernel()

 

compat_ioctl被使用在用户空间为32位模式,而内核运行在64位模式时。这时候,需要将64位转成32位。

 

对几个ioctl执行顺序的分析

 

关于ioctl,unlocked_ioctl和compat_ioctl执行的顺序

对于ioctl操作,优先执行f_op->unlocked_ioctl,如果没有unlocked_ioctl,那么执行f_op->ioctl

sys_ioctl
==> vfs_ioctl
==> file_ioctl
==> do_ioctl
static long do_ioctl(struct file *filp, unsigned int cmd,
        unsigned long arg)
{
    int error = -ENOTTY;

    if (!filp->f_op)
        goto out;

    if (filp->f_op->unlocked_ioctl) { // 优先执行f_op->unlocked_ioctl
        error = filp->f_op->unlocked_ioctl(filp, cmd, arg);
        if (error == -ENOIOCTLCMD)
            error = -EINVAL;
        goto out;
    } else if (filp->f_op->ioctl) { // 如果没有unlocked_ioctl,那么执行f_op->ioctl
        lock_kernel();
        error = filp->f_op->ioctl(filp->f_path.dentry->d_inode,
                      filp, cmd, arg);
        unlock_kernel();
    }

 out:
    return error;
}

对于compat_sys_ioctl系统调用的使用比较麻烦一些,因为默认kernel是不将它built-in进内核的,
可以通过fs/Makefile看到如下定义obj-$(CONFIG_COMPAT) += compat.o compat_ioctl.o
对于CONFIG_COMPAT的定义于cpu体系结构有关,比如下面几个默认cpu配置了CONFIG_COMPAT=y
arch/x86_64/defconfig
arch/sparc64/defconfig
arch/powerpc/configs/ppc64_defconfig
arch/s390/defconfig
arch/parisc/configs/a500_defconfig
arch/mips/configs/ip32_defconfig

compat_sys_ioctl
filp->f_op->compat_ioctl(filp, cmd, arg);
如果该cmd在compat_ioctl中没有找到对应的处理,同时没有filp->f_op方法集[luther.gliethttp]
或者filp->f_op->ioct且filp->f_op->unlocked_ioctl均没有,那么将尝试调用vfs_ioctl,看看是不是一些经典的ioctl命令.

对于sound/core/control.c文件[luther.gliethttp]
#ifdef CONFIG_COMPAT
#include "control_compat.c"
#else
#define snd_ctl_ioctl_compat    NULL
#endif
下面的"controlC%i"声卡对应的控制节点fops的compat_ioctl,当没有定义CONFIG_COMPAT时,将被置为NULL
static const struct file_operations snd_ctl_f_ops =
{
    .owner =    THIS_MODULE,
    .read =        snd_ctl_read,
    .open =        snd_ctl_open,
    .release =    snd_ctl_release,
    .poll =        snd_ctl_poll,
    .unlocked_ioctl =    snd_ctl_ioctl,
    .compat_ioctl =    snd_ctl_ioctl_compat,
    .fasync =    snd_ctl_fasync,
};

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

新内核版本ioctl的变化 _IO, _IOR, _IOW, _IOWR 幻数的理解

kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl : ioctl,unlocked_ioctl和compat_ioctl 现在只有unl...
  • qq_21792169
  • qq_21792169
  • 2016-04-07 22:14
  • 3987

ioctl---字符设备的控制技术

字符设备的控制 1. 字符设备控制理论     1.1 作用           大部分驱动程序除了需要提供读写设备的能力外,还需要具备控制设备的能力。比如:改变波特率     1.2 应用程...
  • coding__madman
  • coding__madman
  • 2016-05-09 22:59
  • 1638

linux驱动程序ioctl函数用法

一、 什么是ioctl     ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。它的调用个数...
  • a1232345
  • a1232345
  • 2015-04-14 17:58
  • 2000

linux3.16驱动unlocked_ioctl

  • 2016-05-18 18:11
  • 6KB
  • 下载

Linux驱动总结3- unlocked_ioctl和堵塞(waitqueue)读写函数的实现

分类: LINUX 原文:http://blog.chinaunix.net/uid-20937170-id-3033633.html   学习了驱动程序的设计,感觉在学习驱动的同时学习linu...
  • wpr188
  • wpr188
  • 2013-04-01 11:13
  • 419

Linux驱动总结3- unlocked_ioctl和堵塞(waitqueue)读写函数的实现

http://blog.chinaunix.net/uid-20937170-id-3033633.html Linux驱动总结3- unlocked_ioctl和堵塞(waitqu...
  • JK198310
  • JK198310
  • 2016-09-25 14:50
  • 470

unlocked_ioctl和堵塞(waitqueue)读写函数的实现

学习了驱动程序的设计,今天主要总结的是ioctl和堵塞读写函数的实现。 一、ioctl函数的实现 首先说明在2.6.36以后ioctl函数已经不再存在了,而是用unlocked_ioctl...
  • haiyangwuxian
  • haiyangwuxian
  • 2017-01-20 15:33
  • 106

Linux驱动总结3- unlocked_ioctl和堵塞(waitqueue)读写函数的实现

摘自:http://blog.chinaunix.net/uid-20937170-id-3033633.html 学习了驱动程序的设计,感觉在学习驱动的同时学习linux内核,也是很不错的过程哦,...
  • XIAHUANLE
  • XIAHUANLE
  • 2014-03-03 11:40
  • 692

Linux驱动总结3- unlocked_ioctl和堵塞(waitqueue)读写函数的实现

学习了驱动程序的设计,感觉在学习驱动的同时学习linux内核,也是很不错的过程哦,做了几个实验,该做一些总结,只有不停的作总结才能印象深刻。 我的平台是虚拟机,fedora14,内核版本为2.6...
  • wh8_2011
  • wh8_2011
  • 2015-12-20 11:25
  • 434

嵌入式 ioctl变成了unlocked_ioctl解释

kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl : ioctl,unlocked_ioctl和compat_ioctl 现在只有unloc...
  • skdkjxy
  • skdkjxy
  • 2013-12-02 14:57
  • 685
    个人资料
    • 访问:223311次
    • 积分:3770
    • 等级:
    • 排名:第9888名
    • 原创:120篇
    • 转载:149篇
    • 译文:0篇
    • 评论:9条
    博客专栏