我们可以看到unlocked_ioctl 和 compat_ioctl这2个函数的最后一个参数是 unsigned long类型的,long类型在不同的架构下面的长度是不同的,在32位平台下是4字节,64位平台下就是8个字节,当32位的应用程序使用ioctl系统调用时,传了4个字节的参数,到驱动中,应该是8个字节,这样就产生了不兼容,为了不影响64位的应用程...
1、compat_ioctl:支持64bit的driver必须要实现的ioctl,当有32bit的userspace application call 64bit kernel的IOCTL的时候,这个callback会被调用到。如果没有实现compat_ioctl,那么32位的用户程序在64位的kernel上执行ioctl时会返回错误:Not a typewriter 2、如果是64位的用户程序运行在64位的kernel上,调用的是unlocke...
在Linux中,ioctl是一个系统调用,它允许用户空间程序与设备驱动程序进行通信。通过编写特定的ioctl命令代码,用户可以控制设备的行为,或者获取设备的状态信息。在红帽操作系统中,有一种特殊的ioctl命令称为“linux compat ioctl”,它允许用户在新的64位系统中使用32位的ioctl接口。 “linux compat ioctl”是一个非常有用...
1. 历史由来 Linux刚开始只有ioctl,没有unlocked_ioctl和compat_ioctl,这时候还是大内核锁机制(BKL),后来因为大内核锁的各种争议而去掉了ioctl,增加了unlocked_ioctl,顾名思义,unlocked就是无锁,因为unlocked_ioctl没了锁,如果想要并发操作,就要在unlocked_ioctl内部实现锁。再后来,为了让32位用户程序能访问64位内核,...
第6行,compat_ioctl函数和ioctl函数一样,都是用于块设备的I/O控制。区别在于在64位系统上,32位应用程序的ioctl会调用compat_iotl函数。在32位系统上运行的32位应用程序调用的就是ioctl函数。 第13行,getgeo函数用于获取磁盘信息,包括磁头、柱面和扇区等信息。
--1562-->相当于file_operations里的compat_ioctl,不过块设备的ioctl包含大量的标准操作,所以在这个接口实现的操作很少 --1567-->在移动块设备中测试介质是否改变的方法,已经过时,同样的功能被check_event()实现 --1571-->即get geometry,获取驱动器的几何信息,获取到的信息会被填充在一个hd_geometry结构中 ...
linux2.6内核compat_ioctl函数 ⼀、内核原型(linux2.6.28-7)long (*compat_ioctl)(struct tty_struct *tty, struct file * file,unsigned int cmd, unsigned long arg);implement ioctl processing for 32 bit process on 64 bit system Optional ⼆、What is compat_ioctl There is one more method ...
(2)如何实现xxx_ioctl函数接口? 增加xxx_ioctl函数接口,应用层可以通过ioctl系统调用,根据不同的命令来操作dev_fifo。 kernel 2.6.35 及之前的版本中struct file_operations 一共有3个ioctl :ioctl,unlocked_ioctl和compat_ioctl 现在只有unlocked_ioctl和compat_ioctl 了 ...
在用户空间使用ioctl时,通过调用此函数,成功执行后返回0,失败则返回-1,并设置全局错误码。在实际应用中,常见错误码如ENOTTY,表示操作的目标不是字符设备,需检查open函数或设备路径是否正确。驱动程序中,新版内核推荐使用unlocked_ioctl和compat_ioctl。unlocked_ioctl应在无大内核锁情况下调用,兼容方法...
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 ...