我正在为一个PCI设备的驱动程序代码工作。 通信是通过一个缓冲区来完成的,也就是我写入一个缓冲区,设备从中获取数据。 设备写入一个缓冲区,我从它gradle的数据。 这是问题发生的地方。 为了让设备写入这个缓冲区,它需要有它的物理地址(不是虚拟的)。 我的老板告诉我,如果我编写一个内核模块并使用kmalloc
分配内存,就可以这样做。
这是我的问题。 如何从用户空间访问此缓冲区,即如何将指针从内核空间传递到用户空间? 由于用户空间中的所有地址都是虚拟地址,因此如何将物理指针转换为虚拟地址? 据我所知,我需要使用ioctl
但我不知道如何。
任何帮助表示赞赏。
如果这是一个PCI设备,那么它已经有一个物理地址,比你需要映射。 您的设备有一个类和一个子类ID。 旋转你所有的PCI设备,直到你得到你的类和子类ID的匹配,然后从中拉出总线地址。
然后使用mmap映射物理地址
C ++应用程序使用mmap在用户空间中通过PCI与PCI通信
我希望这有帮助。
也许你可以使用Netlink套接字API。 这个链接可以帮助你如何使用netlink套接字与内核模块进行通信?