【问题标题】:How do I access(open/read/etc) /dev devices from a kernel module?如何从内核模块访问(打开/读取/等)/dev 设备?
【发布时间】:2012-01-01 04:18:26
【问题描述】:

我收到了一个驱动程序(PCI 卡的 PCAN 驱动程序,使用 rtdm),它创建 /dev/pcan0 并且 /dev/pcan1 被编译为 netdev 驱动程序。

此驱动程序附带了许多工具,但它们都针对读取 CAN 消息的用户级程序。然而,我需要的是从内核模块中读取这些消息。 PCAN 驱动程序不导出任何变量/函数,这意味着它不提供内核级 API 供我使用。

我简要查看了代码并从 /dev 设备读取并写入它不使用 copy_from_usercopy_to_user。因此,我认为从我的内核模块打开 /dev/pcan0 并从中读取应该是安全的。

现在我的问题是,如何从内核模块打开/读取 /dev 设备?

附:我想从 RTAI 实时线程读取 CAN 总线,你认为这会导致问题吗(例如每次读取都通过 linux 内核并因此破坏实时条件?)

【问题讨论】:

标签: linux-kernel device kernel-module can-bus rtai


【解决方案1】:

您可以直接从内核空间使用系统调用:sys_open()、sys_read()、sys_close()。 Linuxjournal article 是关于那个的。

P/S:copy_from_user() 与内核空间地址完美配合。

【讨论】:

  • 感谢copy_from_user 提示。
  • 我知道在内核空间打开文件不是一个好主意,但我不认为用 /dev/ devices 这样做很糟糕
  • 我的意思是,毕竟 /dev 打开/读/写操作基本上归结为对驱动程序的函数调用。但是谢谢,我会尝试想出一个不同的解决方案
  • @Shahbaz r/w 内核空间中的任何文件都不是一个好主意,但是如果他们别无选择,有些人会这样做。通常,如果我可以访问模块的源代码,我会尝试为内核操作提供 API 函数以及为用户空间提供 r/w 处理程序。
  • 好的,谢谢。我发现我实际上可以使用 RTAI 编译驱动程序并使用(尚未测试)rtdm(实时驱动程序模型)从内核空间访问驱动程序。所以,没有文件了。
【解决方案2】:

鉴于我使用的是 RTDM,有两种选择:

  • 使用 RTDM 直接函数,例如 rt_dev_open、rt_dev_read 等
    • 这在当前版本的 pcan 驱动中没有实现
  • 使用 RTDM ioctl
    • 这是解决方案,并且有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-20
    相关资源
    最近更新 更多