【发布时间】:2016-04-25 14:02:12
【问题描述】:
很确定我已经知道这个问题的答案,因为已经有关于 SO 的相关问题(here、here 和 here,和 this 很有用),,,但我想在我深入内核空间驱动程序领域之前绝对确定(以前从未去过那里)。
我有一个 PCIe 设备,我需要通过 linux 用户空间中的应用程序与之通信(反之亦然)。通过打开/dev/mem,然后打开mmap'ing,我已经能够编写一个建立在pciutils 之上的用户空间驱动程序,这使我能够mmap BAR 并成功地将数据写入设备。现在,我们需要 comm 去另一个方向,从 PCIe 设备到 linux 用户应用程序。为了让它工作,我们相信我们需要一大块(~100MB)物理上连续的内存,永远不会被分页/交换。一旦分配,该地址将需要传递给 PCIe 设备,以便它知道在哪里写入数据(因此我看不出这怎么可能是虚拟的、可交换的内存)。没有内核空间驱动程序有没有办法做到这一点?这里有一个想法,也许我们可以打开/dev/mem,然后给它一个ioctl 命令来分配我们需要的东西?如果可能的话,我还没有在网上找到任何示例,需要更深入地研究它。
假设我们需要一个内核空间驱动程序,最好在启动时分配我们的大卡盘,然后使用ioremap 获取内核虚拟地址,然后从那里mmap 到用户空间,对吗?从我在kmalloc 上读到的内容来看,使用该调用我们不会得到接近100MB 的空间,而vmalloc 并不好,因为那是虚拟内存。为了在启动时进行分配,驱动程序应该静态链接到内核中,对吗?这基本上是一个嵌入式应用程序,所以可移植性对我来说不是一个大问题。模块而不是静态链接的驱动程序可能可以工作,但我担心内存碎片可能会阻止找到物理上连续的区域,所以我想在开机后尽快分配它。有什么反馈吗?
EDIT1:我的 CPU 是 ARM7 架构。
【问题讨论】:
标签: linux-kernel driver linux-device-driver embedded-linux pci-e