从内核空间执行ioctl

从内核空间执行ioctl

问题描述:

我正在编写需要在另一个设备上执行ioctl的内核驱动程序。我意识到这不是处理代码的最佳方式,但这只是暂时的解决方案。我从函数中的ioctl调用中找回错误代码-22(无效的参数),但是我没有看到参数有什么问题。以下是代码的相关部分。从内核空间执行ioctl

#define GPIO74 "/dev/gpio/74" 

struct file* gpio74FD; 
    . 
    . 
    . 
gpio74FD = filp_open(GPIO74,O_RDWR,0) 
    . 
    . 
    . 
int device_ioctl(struct inode* inode,struct file *file, unsigned int ioctl_num,unsigned long ioctl_param) 
{ 
    . 
    . 
    . 
ret_val = gpio74FD->f_op->ioctl(inode, gpio74FD, GPIO_CONFIG_AS_INP, 0); //returns error code -22 (Invlaid Argument) 
    . 
    . 
    . 
return ret_val; 
} 

我怀疑它可能有一些做与路过此处不正确的索引节点,但即时通讯甚至不知道如何得到正确的inode如果它不是一个通过从用户空间IOCTL。

+0

对不起,标题写着“用户空间“,但身体意味着内核空间。它是否正确? – JeremyP 2011-03-17 15:20:10

+0

林相当肯定它现在是inode,因为我设法跟踪到其他模块中的return语句。我意识到我确实需要gpio模块的inode,但我仍然不清楚如何获得该inode的句柄 – 2011-03-17 15:20:47

+0

是的,这是一个错字,它应该说内核空间,生病修复 – 2011-03-17 15:26:19

由于您现在非常擅长“不要那样做”的黑客领域,因此在gpio驱动程序中添加一些printk可以为您提供一些有价值的信息。

另一个选项是避免这种可怕的黑客攻击,并切换到危害较小的一个: 添加导出函数的GPIO驱动,你可以从自己的模块调用