【发布时间】:2015-03-13 17:00:11
【问题描述】:
我已经编写了一些 Linux 设备驱动程序,但我仍然处于新手 hack 的水平。我可以让他们工作,但这就是我所能声称的。到目前为止,我已经能够将它们变成使用 write() 写入数据和使用 read() 读取数据的模型。我偶尔会使用 ioctl 进行更精细的控制。
现在我想在 FPGA 逻辑中构建一个协处理块,并在同一个 FPGA 中为 ARM 处理器编写一个设备驱动程序,以将工作从 ARM 卸载到 FPGA。我很难弄清楚如何最好地设计这个界面。
如果对协处理器的访问是独占的,则可以将数据写入驱动程序,处理将在 FPGA 架构中进行,并通过调用读取来检索数据。然而,对协处理硬件的独占访问将是一种浪费。理想情况下,任何用户空间进程都可以使用可用的硬件。我相信如果策略要求用户空间进程打开设备、写入数据、读取结果然后关闭文件,它会起作用。似乎每次需要访问协处理器时打开和关闭文件的开销抵消了首先卸载工作的好处。
我知道在设备驱动程序代码中需要处理很多问题,以安全地处理对硬件的多次访问。但从高层次来看,我希望看到一个概念可以使这个接口工作并遵守 Linux 设备驱动程序的良好实践。
暂时抛开所有复杂性,理想的系统似乎是一个系统,其中任何进程都可以打开设备并拥有一个访问点,数据可以在阻塞调用中写入设备,并且在协处理器完成后读取数据,这很神奇.驱动程序将处理硬件访问,调用进程可以在需要时保持设备文件打开。非常感谢任何见解或指导!
这些都是额外的信息,以防万一有人关心或者它在某种程度上有用或有趣:
这个特殊的 FPGA 是 Xilinx 的 Zynq 器件。它在与 FPGA 结构(基于其 Kintex 系列)相同的硅片上具有双核 Cortex ARM A9。该系统正在运行用于 ARM 的 Arch Linux,并且已经运行一年了。我使用通用名称“协处理器硬件”,因为这个想法是随着时间的推移,这块硬件将获得能力,而它的设备驱动程序的用户空间接口保持相当稳定。例如,您将能够编写 1024 个样本并让该模块执行低通滤波操作、FFT 等,并比处理器本身更快地获得结果。
谢谢!这是我在这里的第一个问题,因此我为违反协议和固有的无知道歉。
--提姆
【问题讨论】:
-
“似乎每次需要访问协处理器时打开和关闭文件的开销抵消了首先卸载工作的好处”。除非您的协处理器正在执行 noop(不太可能,对),否则该语句几乎可以肯定是不正确的?打开和关闭几乎不是密集的操作。那么为什么要把事情复杂化呢?打开,读取,写入,关闭。听起来不错。除非您能想到导致问题的具体原因(我无法从您的帖子中真正得到任何信息)。
-
真的吗?那太好了。我用另一个驱动程序对此进行了测试,并说服自己打开/关闭文件是一个很大的开销。我很可能欺骗了自己。我会更仔细,更严格地看看。感谢您挑战我的假设!
-
取决于“显着开销”的含义。 lmbench(微基准测试套件)的开放系统调用数量显然取决于系统配置。但它大约是 6-30 微秒。因此,了解您如何得出关于开放的初步结论会很有趣。
-
我认为答案是我得出的初步结论是草率的测试和对我认为我会得到的结果的偏见的结合。我应该知道的更好!再次感谢。
标签: linux linux-device-driver fpga zynq