1

我正在开发一个带有嵌入式 ARM 和许多硬连线 IP 块的 SoC。每个硬件块都是内存映射到 ARM 空间的,即控制硬件块的寄存器在 ARM CPU 的空间 32 位地址空间中。我们在这个 CPU 上运行 Linux。

要访问硬件块,我在可以以 root 身份运行的应用程序中使用 mmap,如下所示:

 fd = open("/dev/mem", O_RDWR | O_SYNC);
 mptr = mmap(NULL, mem_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, phy_addr);

在为其他软件工程师开发代码提供 BSP 之前,我想更好地了解一些事情:

  1. MAP_SHARED 是正确的做法还是我也需要 MAP_NORESERVE?基本上,我正在访问硬件寄存器,所以我不需要分配交换空间,对吗?

  2. 如何确保对虚拟空间(上面的 mptr)的读/写不通过缓存?volatile 关键字仅用于编译器优化。

  3. 整个硬件空间实际上相当大 - 16 MB(大量 SRAM 和大量寄存器)。mmap 的长度参数可以那么大还是会导致创建页表和映射时出现问题?我是否需要创建各种虚拟内存指针,或者我可以只获取 mptr 然后添加物理地址偏移量并愉快地读/写硬件地址?

非常感谢,

4

0 回答 0