从连续的物理内存写入硬盘
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 以外的其他系统上对它的支持程度。
【讨论】:
以上是关于从连续的物理内存写入硬盘的主要内容,如果未能解决你的问题,请参考以下文章