我开发使用unlocked_ioctl内核模块。 我用的内核版本2.6.24-23泛型测试,它完美的作品。 现在我用的内核版本3.3.1-1-ARCH尝试过了,奇怪的事情发生了:当请求值(CMD)为2,返回0,不执行ioctl函数,但不会执行该功能。 为了检查不执行它,我做了以下内容:
static long midriver_ioctl(struct file *file,
unsigned int cmd, unsigned long arg) {
printk("Called with cmd = %d\n", cmd);
我写为该设备调用的ioctl从0到4096的测试程序,我可以在dmesg的消息请参见“用CMD被叫= n”的所有这些值,除了“2”,未示出唯一的一个。
什么我做错了任何线索?
先感谢您,
采取一看这个 :
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;
602
正如你所看到的,有一些前的开关的情况下vfs_ioctl
或file_ioctl
电话。
正如@Ilya指出的那样,你打一个通用的情况下( FIGETBSZ
在这种情况下)。
在一般情况下,要使用谱写自己的ioctl命令_IO
系列的宏 ,用独特的类型,以避免冲突。
我建议您阅读的ioctl-number.txt从内核文档的详细信息,包括最常用的类型的列表