从GNU / Linux上的用户进程访问ARM的内部存储器

时间:2009-11-19 14:40:45

标签: c linux-kernel arm

由于对速度的一些要求,我们需要在内部存储器上进行一些计算,然后将计算结果DMA到外部存储器。该应用程序运行在TI DM355处理器上,该处理器基于ARM926EJ-S内核和一组TI外设(EDMA,视频加速器等)。

从应用程序中可以做到多么干净?是否像上述内部存储器地址mmap到虚拟空间并进行计算一样简单?

由于

3 个答案:

答案 0 :(得分:3)

你可以mmap / dev / mem设备:

int mem_fd = open("/dev/mem", O_RDWR);
void *buffer = mmap(NULL, mem_segment_length, PROT_READ | PROT_WRITE, MAP_SHARED,
                    mem_fd, mem_segment_addr);
close(mem_fd);
/* buffer now points to your device's memory */
/* remember to call msync after writing to this to force changes to write back to
 * /dev/mem */

但是,根据您的需要,这可能还不够。 Another question这里有更深入的答案,但你可能最好在内核模块中这样做。

答案 1 :(得分:0)

我认为这需要一定程度的内核和/或驱动程序支持。如果您使用的是特定于您的平台的Linux发行版,则可能已经提供了一些内容。检查您可能拥有的任何文档或示例代码。

我确实找到了一篇关于如何在这里实际进行映射的文章:

http://www.simtec.co.uk/appnotes/AN0014/

这是用于访问GPIO寄存器,但代码应该与片上存储器相同,具有不同的地址。当然,如果其他东西已经在使用那个空间,如果你只是映射它并开始修改它就会崩溃,因此可能需要更多的文档挖掘。你有系统的内核内存映射吗?

答案 2 :(得分:0)

另外,我记得可以将页面固定在内存中。如果我错了,请纠正我。

相关问题