(转载)ioctl与unlocked_ioctl区别

本文讨论了在Linux kernel 2.6.36版本中,应用程序的ioctl与驱动程序ioctl的兼容性问题。随着内核中struct file_operations的ioctl指针被unlocked_ioctl替代,导致驱动程序中的ioctl函数参数发生变化,应用程序ioctl保持兼容,但驱动程序需进行相应调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天调一个程序调了半天,发现应用程序的ioctl的cmd参数传送到驱动程序的ioctl发生改变。而根据《linux设备驱动》这个cmd应该是不变的。因为在kernel 2.6.36 中已经完全删除了struct file_operations 中的ioctl 函数指针,取而代之的是unlocked_ioctl ,所以我怀疑二者是不是兼容的。上网查了一些资料,很多文章只是泛泛谈了一下,说在应用程序中ioctl是兼容的,不必变化。而在驱动程序中这个指针函数变了之后最大的影响是参数中少了inode所以应用程序ioctl是兼容的,但驱动程序中我们的ioctl函数必须变化,否则就会发生cmd参数的变化:

原来的驱动程序

static const struct file_operations globalmem_fops= { .owner=THIS_MODULE, .llseek=globalmem_llseek, .open=globalmem_open, .read=globalmem_read, .write=globalmem_write, .ioctl=globalmem_ioctl, .release=globalmem_release, };

int globalmem_ioctl(struct inode* inode,struct file* filp, unsigned int cmd,unsigned long arg)

{

switch (cmd)

  {

   case:XXX:   ...

    ……

  }

}

改变后的

 

static const struct file_operations globalmem_fops= { .owner=THIS_MODULE, .llseek=globalmem_llseek, .open=globalmem_open, .read=globalmem_read, .write=globalmem_write, .unlocked_ioctl=globalmem_ioctl, .release=globalmem_release, };

int globalmem_ioctl(struct file* filp, unsigned int cmd,unsigned long arg)//没有inode参数!

{

switch (cmd)

  {

   case:XXX:   ...

    ……

  }

}

转载于:https://www.cnblogs.com/hello2mhb/articles/3282489.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值