在自定义硬件上映射内存

Mapping memory on custom HW

本文关键字:映射 内存 硬件 自定义      更新时间:2023-10-16

我是使用mmap和映射HW寄存器的新手,也许问题很简单。所以,我的问题是,我们有一些自定义硬件,它有32位寄存器。一个要求是我必须使用mmap来确保快速的IO操作。

我在示例中看到,人们将dev/mem用作通用文件。这是个好主意吗?还是我应该创建自己的dev/custom并将映射的内存放在那里?这样做有什么好处吗?

其次,有没有任何工具可以让我创建一个映射文件,比如dev/custom,或者如何做到这一点?

第三,如何确保偏移量始终是页面大小的倍数?在我的情况下,这是4096字节。

我使用的是c++和Linux。

这取决于您的硬件平台。对于英特尔PC,您可以执行端口IO和内存映射IO,对于ARM,您可以进行内存IO。

您应该首先说明您支持的总线和配置,例如,它可以用PCI、USB枚举,或者只是在特殊内存中进行硬编码通信(SoC方式)?

最后要担心的是如何将设备(物理)内存实际映射到应用程序或驱动程序的地址空间。在linux上,使用偏移量作为硬件的BAR(页面对齐)进行mmap,然后可以使用虚拟地址指针访问内存映射的IO。(您可能需要进一步调整缓存标志)