我正在为PCI设备开发类似驱动程序的代码。通过缓冲区完成通信,即我写入缓冲区,设备从缓冲区中获取数据。设备写入缓冲区并从中查找数据。这是问题发生的地方。为了使设备能够写入该缓冲区,它需要具有其物理地址(而不是虚拟地址)。我的老板告诉我,如果我编写内核模块并使用kmalloc
分配内存,就可以这样做。
以下是我的问题。
如何从用户空间访问此缓冲区,即如何将指向此缓冲区的指针从内核空间传递到用户空间?由于用户空间中的所有地址都是虚拟地址,如何将物理指针转换为虚拟地址?据我所知,我需要使用ioctl
,但我不知道如何。
感谢任何帮助。
答案 0 :(得分:1)
如果这是PCI设备,那么它的物理地址已经超过了您需要映射的地址。您的设备有一个类和一个子类ID。旋转所有的pci设备,直到你的类和子类id匹配,然后从中拉出总线地址。
然后使用mmap
映射物理地址C++ app to talk to an FPGA over PCI in userland using mmap
我希望这会有所帮助。
答案 1 :(得分:0)
也许你可以使用Netlink Socket API。此链接可能对您有所帮助How to use netlink socket to communicate with a kernel module?