【问题标题】:How to make disk-based buffer just like memory?如何像内存一样制作基于磁盘的缓冲区?
【发布时间】:2025-12-15 03:45:02
【问题描述】:

我在这个网站上看到了一个类似的问题,但没有有用的答案。

场景
以下是数据传输过程,
嵌入式设备-------->buffer-------->AWS(云存储

条件
由于嵌入式设备的限制,没有足够的内存来存储数据。

我的想法
使用 mmap() 在磁盘上分配“内存”,并在另一个库上管理数据中继,该库是 github 上的一个开源库。

问题
但是,我现在才发现它会在真实内存中占用内存。这种方法似乎无法解决我的情况。

你的想法是什么?哥们……

【问题讨论】:

  • mmap() 不占用实际内存,它占用虚拟内存。您的嵌入式设备是否支持 mmap() 并且它是否具有 MMU(提供内存能力)
  • 是的,我的设备支持 mmap()。我的测试程序是: 1.打开一个文件,lseek到2GB。 2.将文件描述传递给mmap,它会返回一个指针。 3.将1字节数据写入指针前导缓冲区0x7fffffff次(2GB数据)。 4.程序运行时,使用'pgrep'获取test.out的pid,'cat /proc/pid/status | grep VmRSS' 查看真实内存。我发现 VmRSS 值随着交换文件而增长
  • 很高兴我们是朋友。 :-D 你的嵌入式设备上有或可以有外部闪存吗?
  • VmRSS 不是“实际内存使用情况”。
  • 不是吗?那么,如何知道一个程序占用了多少内存呢?

标签: c linux buffer


【解决方案1】:

mmmap(2) 所做的只是避免在用户空间应用程序的缓冲区和内核保存缓冲区之间进行额外的数据复制操作。被映射的真实文件部分成为应用程序虚拟地址空间的一部分并占用块缓存中的物理内存,即使您使用的是匿名映射(没有后备文件的映射,fd arg 设置为 -1 )。

因此,通过移动 mmap(2) 窗口,您可以直接访问保存文件数据的内核缓冲区缓存。使用 4K 映射窗口对应虚拟内存映射硬件功能,您的文件可以是任意大小,但只能使用 4K 映射窗口进入文件。

mmap(2) 的好处是您可以打开文件,创建 mmap(2) 窗口,然后关闭文件。现在您可以使用将映射窗口视为数据数组对象的加载/存储来访问文件数据。

【讨论】: