如何将指针从内核空间传递到用户空间,并将其映射到虚拟空间

我正在为一个PCI设备的驱动程序代码工作。 通信是通过一个缓冲区来完成的,也就是我写入一个缓冲区,设备从中获取数据。 设备写入一个缓冲区,我从它gradle的数据。 这是问题发生的地方。 为了让设备写入这个缓冲区,它需要有它的物理地址(不是虚拟的)。 我的老板告诉我,如果我编写一个内核模块并使用kmalloc分配内存,就可以这样做。

这是我的问题。 如何从用户空间访问此缓冲区,即如何将指针从内核空间传递到用户空间? 由于用户空间中的所有地址都是虚拟地址,因此如何将物理指针转换为虚拟地址? 据我所知,我需要使用ioctl但我不知道如何。

任何帮助表示赞赏。

如果这是一个PCI设备,那么它已经有一个物理地址,比你需要映射。 您的设备有一个类和一个子类ID。 旋转你所有的PCI设备,直到你得到你的类和子类ID的匹配,然后从中拉出总线地址。

然后使用mmap映射物理地址

C ++应用程序使用mmap在用户空间中通过PCI与PCI通信

我希望这有帮助。

也许你可以使用Netlink套接字API。 这个链接可以帮助你如何使用netlink套接字与内核模块进行通信?