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

时间:2016-07-29 02:09:27

标签: c linux memory-management linux-kernel

我正在为PCI设备开发类似驱动程序的代码。通过缓冲区完成通信,即我写入缓冲区,设备从缓冲区中获取数据。设备写入缓冲区并从中查找数据。这是问题发生的地方。为了使设备能够写入该缓冲区,它需要具有其物理地址(而不是虚拟地址)。我的老板告诉我,如果我编写内核模块并使用kmalloc分配内存,就可以这样做。

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

感谢任何帮助。

2 个答案:

答案 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?