从映射缓冲区写入“O_DIRECT”输出文件

2023-12-13

我有一个写入视频缓冲区的设备。该缓冲区是使用 CMA 在系统内存中分配的,我想实现从该缓冲区到块设备的流式写入。我的应用程序使用 mmap 打开视频缓冲区,我想使用O_DIRECT写入以避免与页面缓存相关的开销。基本上,应用程序的伪代码如下所示:

f_in = open("/dev/videobuf", O_RDONLY);
f_mmap = mmap(0, BUFFER_SIZE, PROT_READ, MAP_SHARED, f_in, 0);
f_out = open("/dev/sda", O_WRONLY | O_DIRECT);
write(f_out, f_mmap, BLOCK_SIZE);

其中 BLOCK_SIZE 是扇区对齐值。 f_out 打开没有任何错误,但写入结果EFAULT。我试图找出这个问题,结果发现视频缓冲区驱动程序中的 mmap 实现使用remap_pfn_range(),其中设置VM_IO and VM_PFNMAPVMA 的标志。这O_DIRECT块设备驱动程序中的路径检查这些标志并返回EFAULT。据我所理解,O_DIRECT写入需要固定内存页,但 VMA 标志表明不存在struct page对于导致错误的底层内存。我在这儿吗?

主要问题是如何正确实施O_DIRECT从映射缓冲区写入?我有视频缓冲区驱动程序,可以适当修改它。

I found 类似的问题,但这些都没有明确的答案。


功能remap_pfn_range将您的虚拟内存区域指定为special通过使用pte_mkspecial并包括VM_IO/VM_PFNMAP在VMA中。因此,它无法通过特定验证Direct I/O.

既然你的记忆来自于CMA已经支持struct page,你可以利用vm_insert_pages通过以下步骤:

  1. Add CMA使用内核参数或设备树源的区域(DTS).
  2. 从 CMA 获取结构页:
dma_page = dma_alloc_contiguous(&pdev->dev, size, GFP_KERNEL);
if (!dma_page) {
    pr_err("%s %d, dma_alloc_contiguous fail\n", __func__, __LINE__);
    return -ENOMEM;
}
nr_pages = DIV_ROUND_UP(size, PAGE_SIZE);
pages = kvmalloc_array(nr_pages, sizeof(*pages), GFP_KERNEL);
for (i = 0; i < nr_pages; i++)
    pages[i] = &dma_page[i];
  1. 调用时将页面插入vmammap:
int your_mmap(struct file *file, struct vm_area_struct *vma) {
    int ret = 0;
    unsigned long temp_nr_pages;

    if (vma->vm_end - vma->vm_start > size)
        return -EINVAL;

    /* Duplicate nr_pages as vm_insert_pages can change nr_pages */
    temp_nr_pages = nr_pages;

    ret = vm_insert_pages(vma, vma->vm_start, pages, &temp_nr_pages);
    if (ret < 0)
        pr_err("%s vm_insert_pages fail, error is %d\n", __func__, ret);

    return ret;
}
  1. Export dma_alloc_contiguous(唯一的内存管理代码发生了变化,但这是可以接受的)。
modified   kernel/dma/contiguous.c
@@ -332,6 +332,7 @@ struct page *dma_alloc_contiguous(struct device *dev, size_t size, gfp_t gfp)

        return cma_alloc_aligned(dma_contiguous_default_area, size, gfp);  }
+EXPORT_SYMBOL(dma_alloc_contiguous);

 /**
  * dma_free_contiguous() - release allocated pages
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从映射缓冲区写入“O_DIRECT”输出文件 的相关文章

  • java中filewriter的flush和close函数之间的区别

    我需要知道Java中的flush和close函数之间的确切区别是什么 当在写入文件期间将数据转储到文件中时 请提供一个例子 flush just确保所有缓冲数据都写入磁盘 在这种情况下 更一般地说 通过您正在使用的任何 IO 通道刷新 之后
  • java IO将一个文件复制到另一个文件

    我有两个 Java io File 对象 file1 和 file2 我想将 file1 的内容复制到 file2 有没有一种标准方法可以做到这一点 而无需我创建一个读取 file1 并写入 file2 的方法 不 没有内置方法可以做到这一
  • 无法访问打开的/arch/x86/syscalls/syscall_32.tbl

    当我在切换到内核后编写此命令时 当我编译它时 它没有显示任何列表 是否有其他命令可以打开列表 open arch x86 syscalls syscall 32 tbl Bug 先删除 文件路径中的字符 应该是relative http e
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些
  • 如何从标准输入读取一行,阻塞直到找到换行符?

    我试图从命令行的标准输入一次读取任意长度的一行 我不确定是否能够包含 GNU readline 并且更喜欢使用库函数 我读过的文档表明getline应该可以工作 但在我的实验中它不会阻塞 我的示例程序 include
  • 这个反斜杠在这段汇编代码中起什么作用?

    我不确定这些推线有什么区别 修剪下来来自 Linux 的 x86 entry calling h https github com torvalds linux blob 241e39004581475b2802cd63c111fec43b
  • 对在 C++ 应用程序中作为函数参数传递的文件运行“iconv”命令

    我正在尝试将 Windows 文件 CP1252 格式 转换为 Linux 应用程序的 UTF 8 格式 我想在我的 C 应用程序中运行以下命令 iconv f CP1252 t UTF 8 file ldf dos2unix gt out
  • 对 os.listdir 文件进行排序 Python

    如果已下载数年的数据 这些数据存储在具有以下命名约定的文件中 year day dat 例如 名为 2014 1 dat 的文件包含 2014 年 1 月 1 日的数据 我需要按天排序读取这些数据文件 2014 1 dat 2014 2 d
  • 串行 I/O 与 Windows/Windows CE 重叠/不重叠

    抱歉 这不是一个大问题 但更多的是帮助那些在这些特定问题上遇到问题的人 我正在解决的问题需要使用串行 I O 但主要在 Windows CE 6 0 下运行 然而 最近有人问我该应用程序是否也可以在 Windows 下运行 所以我开始着手解
  • Linux中的CONFIG_OF是什么?

    我看到它在很多地方被广泛使用 但不明白在什么场景下我需要使用它 What is 配置 OF OF 的全名是什么 打开固件 这是很久以前发明的 当时苹果公司正在生产基于 PowerPC CPU 的笔记本电脑 而 Sun Microsystem
  • 我可以用 HTML5/JS 编写文件吗?

    我想知道是否有什么方法可以从 HTML5 JS 写入文件 在浏览器中 假设您的最终目标是让用户将您的文件保存在他们能找到的地方 例如右键单击链接并选择 另存为 时 这些 API 的浏览器覆盖范围还不够广泛 这可能是由于出于安全考虑 然而 无
  • 设备树不匹配:.probe 从未被调用

    我无法理解设备树的工作原理 或者具体来说为什么该驱动程序无法初始化 这是在 android 版本 3 10 的 rockchip 供应商内核中 驱动程序 看门狗 rk29 wdt c 为了可读性而减少 static const struct
  • 为什么这段代码会死锁?

    我在可加载模块中创建了 2 个 Linux 内核线程 并将它们绑定到在双核 Android 设备上运行的单独 CPU 内核 运行几次后 我注意到设备重新启动并重置了硬件看门狗定时器 我一直在解决这个问题 什么可能导致僵局 基本上 我需要做的
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 在许多驱动程序文件夹中创建 build-in.o

    我正在用我的自定义驱动程序构建内核 成功构建后 我发现了许多 build in o 文件 任何人都可以详细说明这些文件是如何在这里结束的吗 我只能怀疑这些与更高级别的 makefile 有关 built in o 文件是未构建为模块的内核的
  • 在ubuntu内核中启用cgroup cpu实时运行时

    我正在尝试在 Ubuntu 18 04 上运行的 docker 容器中使用实时调度 我已经按照给定的方法安装了实时内核here https stackoverflow com questions 51669724 install rt li
  • 在 Android 上生成 FileDescriptor 而不先打开文件

    在Android中 是否可以直接从字节数组生成FileDescriptor 而不必先打开文件 在 Android 2 2 中 我动态生成 MIDI 文件 然后使用 MediaPlayer 进行播放 我在下面包含了成功执行此操作的 Main
  • 如何使用 StreamWriter 写入文件?

    在我的 Wpf 应用程序中 我使用一个 Person 类 即基类 它包含一个虚拟方法 SaveData 以及从 Person 继承的其他类 Client 如何重写方法 SaveData 并保留基础数据 类人 public virtual v
  • 内核模块未加载(但 insmod 返回 0)

    我必须向现有设备 mips arch 添加一些功能 我已经尝试了几个 SDK 目前我取得了一些进展 但是 insmod 返回 0 成功 并且 lsmod 显示它们 但是 printk 和 create proc entry 都不起作用 但我

随机推荐

  • JAVA中将时间字段H:M转换为整数字段(分钟)

    JTable 包含时间字段 例如 01 50 我需要将该值读入整数变量 为此 我想将时间转换为分钟 例如 01 50 应转换为 110 为了解决这个任务 首先我将时间值保存为字符串 String minutS tableModel getV
  • 无序列表的li后等间距

    我已经删除了后面的点 li of ol 并给出了 在号码之后 我通过使用下面的代码实现了它 ol counter reset item ol li before content counter item counter increment
  • 将更多值附加到共享首选项而不是覆盖现有值

    在我的应用程序中 我需要将值保存到 Sharedpreferences 文件 RKs Data 中 而不覆盖现有数据 每次 我在应用程序中单击 是 时 我都需要存储在 RKs Data 中的所有值 而不仅仅是将最新的 名称 和 电话号码 添
  • pandas 使用哪种方法计算百分位数?

    我试图理解 pandas 中的下 上百分位数计算 但有点困惑 这是示例代码及其输出 test pd Series 7 15 36 39 40 41 test describe output 我只对 25 75 的百分位感兴趣 我想知道 pa
  • opencv计算矩阵秩

    我正在尝试找到矩阵的秩 在 matlab 中 这相当简单 但我使用的是 Visual Studio 2008 c 我最近安装了 openCV 到目前为止它适用于我的大部分矩阵算术 除了我不知道如何使用 openCV 来获得矩阵的排名 在我的
  • 在 HttpClient 中设置 Authorization 标头安全吗?

    我正在 MVC5 ASP NET 项目中工作 并了解到要从控制器向 WEB API 发送经过身份验证的请求 我可以执行以下操作以将令牌添加到标头 使用示例代码 public static class APICaller Use a sing
  • 当给定参数是两个项目和一个列表时,如何在 DrScheme 中将列表中的一个项目替换为另一个项目?

    当给定参数是两个项目和一个列表时 如何在 DrScheme 中将列表中的一个项目替换为另一个项目 Use map使用一个函数 当其参数等于要替换的项目时返回替换项目 否则返回该参数
  • 如何连接静态字符串数组[重复]

    这个问题在这里已经有答案了 可能的重复 Java中如何连接两个数组 我已将 SET1 声明为静态 String 并且我想将 SET2 声明为 SET1 一些其他参数 是否可以声明 SET2 与 SET1 静态相似 即 private sta
  • 在 Windows 批处理文件中转义用户输入

    我有一个 Windows 批处理文件 它接受密码作为用户输入 SET P PASSWORD Password 该密码可能包含需要转义的字符 例如 The PASSWORD然后使用变量将其传递给其他批处理文件CALL CALL Foo Bat
  • MySQL 逻辑运算符

    鉴于查询 SELECT foo FROM bar WHERE a x AND b y OR c z 它如何解析这个查询 a x AND b y OR c z a x AND b y OR c z 这是一个简单的示例 但如果您将 AND OR
  • 求 R 中函数的最大值

    我有以下功能 设 F 是累积分布函数gamma分布与shape 1 and rate 1 分母是生存函数S X 1 F X The g x 是平均剩余寿命函数 我在r中编写了以下函数 x 5 denominator 1 pgamma x 1
  • 定义一个新变量以进行大量迭代,给我一个错误

    我有一个端点 您可以获取有关产品的信息 URL API 产品 如果我通过该端点执行 GET 方法 我将获取每个产品的信息 但我也可以指定我想了解的产品 即 URL API products 9345TERFER 最后一个代码是产品的id 称
  • 仅显示 PHP 检索到的标题的第一个单词

    所以我试图显示我的另一个网站的列表 一切正常 但只存储 标题 属性的第一个单词 我知道整个标题是从其他网站检索的 所以我如何让它存储所有内容 如果有帮助的话 这是代码
  • JavaFX ListView 中的图像

    有没有办法将图像添加到 JavaFX ListView 中 这就是我当前设置列表视图项目的方式 private ListView
  • 1/0 是合法的 Java 表达式吗?

    以下内容在我的 Eclipse 中编译良好 final int j 1 0 compiles fine throws ArithmeticException by zero at run time Java 从一开始就阻止了许多 哑代码 的
  • 在 Microsoft Visual Studio 2013 的 WinForms 中启用 Entity Framework 6 for MySql (C#)

    昨天我知道实体框架是除了使用 Dataset 或 DataReader 之外访问数据库的另一种方法 然后我尝试使实体框架 6 适用于 MVS 2013 中的 MySql 数据库服务器 我使用 Net FrameWork 4 5 1 打开 W
  • 如何使用 Beautiful Soup 提取没有属性的

    标签?

    假设一个网页包含以下内容 p style display none p
  • ASP.NET 应用程序内存使用率较高

    我们的一些 ASP Net 应用程序存在问题 我们的一些应用程序从一开始就占用大量内存作为其工作集 在我们的 2 个 webfarm 服务器 每个 4GB RAM 上运行多个应用程序 我们有一个稳定的环境 大约有 1 2GB 的可用内存 然
  • 使用 CLGeocoder 的正向地理编码示例

    除了 Apple 文档之外 还有有关工作示例的说明或有关如何使用正向地理编码的一些指南 这很通用 我无法理解 拜托 这太好了 还有人知道他们是使用 Google API 来实现相同的还是他们自己的吗 发现这个有效 但如果其他人发现它有用 我
  • 从映射缓冲区写入“O_DIRECT”输出文件

    我有一个写入视频缓冲区的设备 该缓冲区是使用 CMA 在系统内存中分配的 我想实现从该缓冲区到块设备的流式写入 我的应用程序使用 mmap 打开视频缓冲区 我想使用O DIRECT写入以避免与页面缓存相关的开销 基本上 应用程序的伪代码如下