kernel4.1 ioctl调用

Posted Qiengo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 = filp->f_path.dentry->d_inode;
 552
 553        switch (cmd) {
 554        case FIOCLEX:
 555                set_close_on_exec(fd, 1);
 556                break;
 557
 558        case FIONCLEX:
 559                set_close_on_exec(fd, 0);
 560                break;
 561
 562        case FIONBIO:
 563                error = ioctl_fionbio(filp, argp);
 564                break;
 565
 566        case FIOASYNC:
 567                error = ioctl_fioasync(fd, filp, argp);
 568                break;
 569
 570        case FIOQSIZE:
 571                if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode) ||
 572                    S_ISLNK(inode->i_mode)) {
 573                        loff_t res = inode_get_bytes(inode);
 574                        error = copy_to_user(argp, &res, sizeof(res)) ?
 575                                        -EFAULT : 0;
 576                } else
 577                        error = -ENOTTY;
 578                break;
 579
 580        case FIFREEZE:
 581                error = ioctl_fsfreeze(filp);
 582                break;
 583
 584        case FITHAW:
 585                error = ioctl_fsthaw(filp);
 586                break;
 587
 588        case FS_IOC_FIEMAP:
 589                return ioctl_fiemap(filp, arg);
 590
 591        case FIGETBSZ:
 592                return put_user(inode->i_sb->s_blocksize, argp);
 593
 594        default:
 595                if (S_ISREG(inode->i_mode))
 596                        error = file_ioctl(filp, cmd, arg);
 597                else
 598                        error = vfs_ioctl(filp, cmd, arg);
 599                break;
 600        }
 601        return error;

 就是说对于某些cmd参数值,是不会去调用内核的ioctl的,我程序里的cmd是2,上述case中FIGETBSZ的值就是2

 

记录下。

以上是关于kernel4.1 ioctl调用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有第二个参数设置 0xFACE 的 ioctl 来调用特定函数?

使用 FIONREAD 调用 ioctl() 会在明显的竞争条件下导致奇怪的副作用,

在linux中使用ioctl()调用设置串口的DTR RTS引脚时遇到问题

fcntl.ioctl() 的 64 位参数

为啥 ioctl 调用没有传递给 sys_ioctl?

如何正确地将 C ioctl 调用转换为 python fcntl.ioctl 调用?