Linux kernel 如何从内核模块访问(open/read/etc)/dev设备?

Linux kernel 如何从内核模块访问(open/read/etc)/dev设备?,linux-kernel,device,kernel-module,can-bus,rtai,Linux Kernel,Device,Kernel Module,Can Bus,Rtai,我收到了一个驱动程序(PCI卡的PCAN驱动程序,使用rtdm),它创建了/dev/pcan0,并且/dev/pcan1被编译为netdev驱动程序 该驱动程序附带了许多功能,但它们都是针对读取CAN消息的用户级程序。然而,我需要的是从内核模块读取这些消息。PCAN驱动程序不导出任何变量/函数,这意味着它不提供内核级API供我使用 我简单地看了一下代码,从/dev设备读取并写入,不要使用copy\u from\u user或copy\u to\u user。因此,我认为从内核模块中打开/dev/

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

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

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

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


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

您可以直接从内核空间使用系统调用:sys\u open()、sys\u read()、sys\u close()。 关于这一点,没有什么可担心的


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

考虑到我使用的是RTDM,有两个选项:

  • 使用RTDM直接函数,如rt_dev_open、rt_dev_read等
    • 这在当前版本的pcan驱动程序中未实现
  • 使用RTDM ioctl
    • 这就是解决方案,它奏效了

潜在有用:感谢用户提供的
copy\u from\u-user
技巧。我知道在内核空间打开文件不是一个好主意,但我认为使用/dev/devices这样做没有那么糟糕。毕竟,/dev打开/读/写操作基本上归结为对驱动程序的函数调用。但是谢谢,我会尝试提出一个不同的方法solution@Shahbaz从内核空间r/w任何文件都不是一个好主意,但有些人在没有选择的情况下会这样做。通常,如果我可以访问模块的源代码,我会尝试为内核内操作提供API函数,并为用户空间提供r/w处理程序。好的,谢谢。我发现我实际上可以用RTAI编译驱动程序,并使用(尚未测试)rtdm(实时驱动程序模型)从内核空间访问驱动程序。所以,没有文件了。