嵌入式 ioctl变成了unlocked_ioctl解释

原创 2013年12月02日 14:57:58
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;
struct backing_dev_info *bdi;

这次内核函数的变化引出了一个问题,从ioctl系统调用往后,真正的ioctl调用顺序是什么?为什么compat_ioctl不被调用?
compat_ioctl被使用在用户空间为32位模式,而内核运行在64位模式时。这时候,需要将64位转成32位。
以下是2.6.36的情况:
SYSCALL_DEFINE3(ioctl ...) compat_sys_ioctl(是否直接调用compat_ioctl 取决于compat_ioctl 是否存在)
| | |-----> compat_ioctl
| |
|------>do_vfs_ioctl(下一步的调用取决于file->f_path.dentry->d_inode->i_node)
| |------>file_ioctl
| |
|-------------------------------->vfs_ioctl
|------->unlock_ioctl
其实compat_ioctl 没有被调用的原因是compat_sys_ioctl没有被调用,而它没有被调用的原因似乎是压根就没有编译到内核中,因为我没有找到调用这个函数的代码。
unlocked_ioctl 实际上取代了用了很久的ioctl,主要的改进就是不再需要上大内核锁(调用之前不再先调用lock_kernel()然后再unlock_kernel())
总的来说kernel开发者正在试图朝移除大内核锁的方向努力,ioctl的移除就是被革命了。相信以后越来越多的内核函数会摆脱大内核锁的依赖,并且大内核锁最终会被移除。

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

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

新内核版本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
  • 3984

python解释器实现及其嵌入式应用:解释器移植

一 概述 1-1 知识储备 1-2 成果展示 二 移植过程 2-1 代码选型 2-2 启动代码实现 2-3 指令集兼容 4 修改内存分布 5 交互界面 三 总结与展望 一 概述micropython:...
  • abcamus
  • abcamus
  • 2017年01月12日 16:01
  • 1703

嵌入式 获取网卡设备以及IP和MAC地址示例以及网络编程之ioctl小结

#include #include #include #include #include #include #include #include #ifdef SOLAR...
  • skdkjxy
  • skdkjxy
  • 2014年04月28日 15:57
  • 1967

嵌入式 浅谈fcntl与ioctl函数

fcntl: #include ioctl函数提供对连接到fd的设备驱动程序的属性和操作的访问 其原型为 extern int ioctl(int fd,unsigned long int requ...
  • skdkjxy
  • skdkjxy
  • 2013年12月19日 11:20
  • 1532

嵌入式 ioctl函数的实际意义小论

函数名: ioctl 头文件:#include 功 能: 控制I/O设备 ,提供了一种获得设备信息和向设备发送控制参数的手段。用于向设备发控制和配置命令 ,有些命令需要控制参数,这些数据是不能用r...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:45
  • 632

嵌入式 globalmem设备驱动ioctl()函数的实现

一、ioctl的简介 在文件操作结构体file_operations中有很多的对应的设备操作函数,这些函数是通用的设备操作函数,但有些设备的操作是特有的,文件操作结构体不会有对应的函数定义。这样i...
  • skdkjxy
  • skdkjxy
  • 2013年12月02日 14:56
  • 573

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
  • 418

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
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 ioctl变成了unlocked_ioctl解释
举报原因:
原因补充:

(最多只允许输入30个字)