我如何从内核模块访问(打开/读取/等)/dev设备



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

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

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

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

注:我想从RTAI实时线程的CAN总线读取数据,您认为这会导致问题吗(例如,每次读取都通过linux内核,从而破坏实时条件?)

您可以直接从内核空间使用系统调用:sys_open(), sys_read(), sys_close()。Linuxjournal上有一篇关于这个的文章。

p/S: copy_from_user()可以很好地处理内核空间地址

考虑到我正在使用RTDM,有两个选项:

  • 使用RTDM直接函数,如rt_dev_open, rt_dev_read等
    • 这在当前版本的pcan驱动程序
    • 中没有实现
  • 使用RTDM ioctl
    • 这是解决方案,它工作

最新更新