【发布时间】:2017-05-19 17:02:26
【问题描述】:
当我尝试研究一些处理 FPGA 的代码时,我遇到了 munmap、mmap。
我浏览了here 提供的手册。我仍然不明白这个功能的目的。这到底是做什么的?
【问题讨论】:
-
我建议阅读这个问题的最佳答案:stackoverflow.com/questions/258091/…。
标签: c++ c linux system-calls
当我尝试研究一些处理 FPGA 的代码时,我遇到了 munmap、mmap。
我浏览了here 提供的手册。我仍然不明白这个功能的目的。这到底是做什么的?
【问题讨论】:
标签: c++ c linux system-calls
它将一块磁盘缓存映射到进程空间,以便可以在字节级别操作映射的文件,而不是要求应用程序通过 read()、write() 等的 VFS。
【讨论】:
MAP_ANONYMOUS,在这种情况下没有文件:)
mmap() 是一个系统调用,它有助于内存映射 I/O 操作。它分配一个内存区域并将其映射到调用进程的虚拟地址空间,以使应用程序能够访问内存。
mmap() 返回一个指向映射区域的指针,该映射区域可用于访问内存。
同样,munmap() 删除了映射,因此对已分配内存的进一步访问仍然合法。
这些是较低级别的调用,在行为上类似于更高级别的内存分配器函数(如 malloc() / free())提供的调用。但是,此系统调用允许对分配的区域行为进行细粒度控制,例如,
MAP_FIXED 标志)MAP_UNINITIALIZED标志)等等
如果您认为其他措辞可以帮助您,也可以参考wikipedia article。
【讨论】:
说明书很清楚:
mmap() 在调用进程的虚拟地址空间中创建一个新的映射
简而言之,它将一块文件/设备内存/任何东西映射到进程的空间中,这样它就可以通过访问内存来直接访问内容。
例如:
fd = open("xxx", O_RDONLY);
mem = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
将文件内容映射到mem,读取mem就像读取文件内容xxx一样。
如果fd是某个FPGA的设备内存,那么mem就变成了FPGA的内容。
在某些情况下使用起来非常方便高效。
【讨论】: