ioctl和unlock_ioctl的区别

今天调一个程序调了半天,发现应用程序的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:   ...

……

}

}

时间: 2024-10-07 17:27:21

ioctl和unlock_ioctl的区别的相关文章

几个Linux驱动面试题目

这几天面试几个想做安卓Linux驱动的,总体感觉上驱动基础还是比较薄弱,大部分情况是虽然做过驱动,但是基本上都是采用内核现成的,或者是开发板上已经有的,单独写过模块驱动很少,驱动机制理解不是很透彻.以下是几个随口问过的基础问题,供参考. 1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的? 2.写一个中断服务需要注意哪些?如果中断产生之后要做比较多的事情你是怎么做的? 3.自旋锁和信号量在互斥使用时需要注意哪些?在中断服务程序里面的互斥是使用自旋锁还

linux驱动面试题整理

资料来自网上,简单整理,答案后续补充...... 1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也叫手动创建设备文件.还有UDEV/MDEV自动创建设备文件的方式,UDEV/MDEV是运行在用户态的程序,可以动态管理设备文件,包括创建和删除设备文件,运行在用户态意味着系统要运行之后.那么在系统启动期间还有devfs创建了设备文件.一共有三种方式可

EZUSB 和 CYUSB 及驱动上位机的区别【转发】

转改发自:[喝小酒的网摘]http://blog.const.net.cn/a/9033.htm 如果你的固件里VID ,PID是04B4,1002(或者其他,具体看ezusbw2k.inf文件的支持),那么这个时候你对应的驱动就是EZUSB驱动文件 ezusb.sys.ezusbw2k.inf,这个驱动就是所谓的通用驱动GPD( General Purpose Drive):相应的,控制台使用EZ-USB Control Panel进行调试,如下图: 这个时候后,上位机变成就使用Winapi编

驱动笔记 - ioctl

#include <linux/ioctl.h> 定义命令 _IO(type,nr) 没有参数的命令 _IOR(type,nr,datatype) 从驱动中读数据 _IOW(type,nr,datatype) 写数据到驱动 _IOWR(type,nr,datatype) 双向传送,type和number成员作为参数被传递例: #define MEM_IOC_MAGIC 'm' #define MEM_IOCSET _IOW(MEM_IOC_MAGIC,0,int) #define MEM_IO

Android如何区别真机和模拟器

一,native方式. 通过c代码读取设备中的配置和硬件相关信息. 1,diskstats 获取闪存的分区状态信息. int fd = open(“/proc/diskstats”, O_RDONLY); bytes = read(fd, buf, bytes); 区别:真机下都有mmcblk0分区,但是模拟器没有分区信息. 2,mac地址. 通过socket和ioctl读取mac地址. sockfd = socket(AF_INET, SOCK_DGRAM, 0); ioctl(sockfd,

(二十)linux中i2c的ioctl,write,read函数的使用

一.ioctl函数的使用:原型:struct ioctl(struct file *file,unsigned int cmd,unsigned long arg);cmd有I2C_SLAVE,I2C_SLAVE_FORCE,I2C_TENBIT,I2C_S3C2410_SET_SPEED几个选项:I2C_SLAVE:对应的arg取值为I2C从机地址,用来设定I2C从机地址: I2C_SLAVE_FORCE:对应的arg取值为I2C从机地址,用来修改I2C从机地址: I2C_TENBIT:对应的

kernel4.1 ioctl调用

在4.1内核中开发时遇到个奇怪的问题: 用户空间的ioctl无法调用到内核空间的unlock_ioctl 排查源码发现 546 int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd, 547 unsigned long arg) 548 { 549 int error = 0; 550 int __user *argp = (int __user *)arg; 551 struct inode *inode =

Ioctl返回-1的一个Bug查找

最近调试SmartCard驱动的时候发现ioctl返回值为-1,明明很正常的一个驱动,在别的地方都能正常跑,居然有问题:一直百思不得其解,开内核log,居然没有执行到驱动设备Ioctl函数里面,第一时间想到的就是参数对不上,继续查找,发现没有问题,参数注册都正常,char驱动open\read\write接口都没有问题,居然只有这个ioctl有问题:继续跟踪file_operations结构,发现在这个结构中存在compat_ioctl,自从ioctl随着BKL退出历史的舞台之后,一直用到的是u

linux下系统调用、API、系统命令,内核函数的区别与联系

1.系统调用: 应用程序和内核间的桥梁,是应用程序访问内核的入口点;但通常情况下,应用程序通过操作系统提供的API进行编程而不是使用系统调用直接编程; linux的全部系统调用加起来大约只有250个左右. 2.API: API常以c库(libc)的形式提供,c库提供了绝大部分API,每个系统调用在c库中都有对应的封装函数(通常封装函数与系统调用的名称相同).系统调用与c库函数并不是一一对应的,有些c库函数可能使用多个系统调用来实现,也有可能多个c库函数使用同一个系统调用来实现,也有些c库函数不使