我正在开发一个带有嵌入式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的length参数可以是那么大还是会导致创建页表和映射的麻烦?我是否需要创建各种虚拟内存指针,或者我可以获得mptr,然后只是快速添加物理地址偏移量和读/写硬件地址?
非常感谢,