从连续的物理内存写入硬盘

Posted

技术标签:

【中文标题】从连续的物理内存写入硬盘【英文标题】:Writing to hard disk from contiguous physical memory 【发布时间】:2012-11-28 00:28:53 【问题描述】:

我有一个基于 ARM 的设备,运行 linux,它连接到相机,我正在尝试有效地将捕获的帧存储到 HD。

我正在用户空间开发,但可以随意修改驱动程序 我正在用 C 编写代码 使用 DMA 写入内存的帧,我有它们的物理内存指针。 我能够控制所有的帧捕获流程,并且我可以判断帧缓冲区何时稳定(来自 video4linux 驱动程序的 dqueued) Linux 版本为 3.0.35 我对内核源代码很熟悉,不是专家,但只要我得到一些提示,我就能找到方法并弄清楚事情......

我相信我有两种选择:

    为我的文件系统找到最佳配置,用于打开文件并写入文件。我现在使用 ext4 和标准 fopen() fwrite() 函数。我知道我也可以使用 mmap,或者在调用 open() 时添加 O_DIRECT 标志,但还没有尝试过。

    想办法传递缓冲区的物理地址(我能搞定 从我的 Video4Linux 驱动程序)直接到文件系统/硬盘驱动器驱动程序, 因此数据将直接从那里传输。

我发现方法 1 很慢,内存事务是我的瓶颈,因为 fwrite 涉及将数据从用户空间复制到内核空间,然后再复制到某种缓存,然后再复制到 DMA。简单存储的内存事务太多...

关于方法 2 - 我不知道这是否可能,但如果我是从头开始设计这个系统的人,我会这样做。

有什么想法吗?

关于方法 1(使用 open() 和 write()、mmap() 和/或 O_DIRECT) 您能推荐一个适合我的最佳设置吗? 方法 2(直接从现有 DMA 缓冲区存储到 HD)是否可行?如果是这样 - 你能给我举个例子吗?

【问题讨论】:

拜托,你能把这个过程的代码sn-p贴出来吗?我有完全相同的问题,我知道 mmap 是解决方案,但不明白如何使用它。非常感谢。 【参考方案1】:

在 UNIX 上通过 mmap 写入文件的唯一问题是您必须处理信号以防磁盘空间不足 或者您已确定该文件不是稀疏的 因此所有需要的磁盘空间都已分配。 我认为最新的 G++ 提供了一种将信号转换为 C++ 异常处理的方法, 但我不确定在 mac-os 以外的其他系统上对它的支持程度。

【讨论】:

以上是关于从连续的物理内存写入硬盘的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Linux的内存管理机制

Linux内存机制(swap)

Linux内存机制以及手动释放swap和内存

Linux内存机制以及手动释放swap和内存

Linux内存机制以及手动释放swap和内存

Linux内存机制以及手动释放swap和内存