2012-04-09 60 views
11

我正在开发使用unlocked_ioctl的内核模块。我使用内核版本2.6.24-23-generic对其进行了测试,并且它完美地工作。现在我尝试了内核版本3.3.1-1-ARCH,并发生了一些奇怪的事情:当请求值(cmd)为2时,ioctl函数未执行。它返回0,但函数未执行。为了检查它不执行我做了以下内容:如果cmd = 2,则不会调用ioctl

static long midriver_ioctl(struct file *file, 
    unsigned int cmd, unsigned long arg) { 

printk("Called with cmd = %d\n", cmd); 

我写了从0这个设备以4096调用的ioctl一个测试程序,我可以在dmesg的用CMD称为消息”中看到= n“表示除了”2“之外的所有这些值,这是唯一没有显示的值。

我做错了什么线索?

谢谢你在前进,

+0

一些代码了在链拦截CMD == 2和处理它的列表? – zvrba 2012-04-09 09:32:05

回答

9

看看上this

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_ioctlfile_ioctl电话。

+0

我没有看到相关性,这些情况都不适用 – Hasturkun 2012-04-09 09:40:54

+1

我纠正了,'FIGETBSZ'的值实际上是2,+1 – Hasturkun 2012-04-09 09:43:12

3

正如@Ilya指出的那样,您遇到了一般情况(本例中为FIGETBSZ)。

通常情况下,您希望使用_IO family of macros(使用唯一类型)编写ioctl命令以避免冲突。

我建议从内核文档阅读ioctl-number.txt的更多信息,包括最常用的类型

+0

这是一个使用'_IOx'的最小'ioctl'示例:https:// stackoverflow的.com /一个/895245分之44613896 – 2017-06-18 10:11:57

相关问题