【问题标题】:Performing an ioctl from the kernel-space从内核空间执行 ioctl
【发布时间】:2011-07-17 11:18:49
【问题描述】:

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

#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 的 inode,我什至不确定如何获取正确的 inode。

【问题讨论】:

  • 对不起,标题是“用户空间”,但正文暗示内核空间。这是正确的吗?
  • 我很确定它现在是 inode,因为我设法将其追踪到另一个模块中的 return 语句。我意识到我确实需要 gpio 模块的 inode,但我仍然不清楚如何获取该 inode 的句柄
  • 是的,这是一个错字,应该说是内核空间,我修好了
  • gpio74FD->f_dentry->inode下找不到文件的inode吗?或者我相信的类似的东西。
  • 好的,我不确定如何准确获取 inode,但 gpio74FD->f_dentry->d_inode 似乎工作正常。在我有机会重新刷新我的 linux 设备之前,我不确定这是否能解决我的全部问题。感谢您为我指明正确的方向

标签: c linux module kernel


【解决方案1】:

由于您现在深陷“不要那样做”的黑客领域,向 gpio 驱动程序添加一些 printk 可以为您提供一些有价值的信息。

另一种选择是避免这种可怕的黑客攻击,并改用危害较小的黑客攻击: 将导出函数添加到 gpio 驱动程序,您可以从自己的模块中调用它

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2012-06-21
    • 2011-07-11
    • 2012-07-15
    • 2015-06-26
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多