我正在开发一个带有嵌入式 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 之前,我想更好地了解一些事情:
MAP_SHARED 是正确的做法还是我也需要 MAP_NORESERVE?基本上,我正在访问硬件寄存器,所以我不需要分配交换空间,对吗?
如何确保对虚拟空间(上面的 mptr)的读/写不通过缓存?volatile 关键字仅用于编译器优化。
整个硬件空间实际上相当大 - 16 MB(大量 SRAM 和大量寄存器)。mmap 的长度参数可以那么大还是会导致创建页表和映射时出现问题?我是否需要创建各种虚拟内存指针,或者我可以只获取 mptr 然后添加物理地址偏移量并愉快地读/写硬件地址?
非常感谢,