从映射缓冲区写入“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”输出文件 的相关文章

  • 使用sk_buff添加以太网帧头

    我有一个捕获传出互联网流量的内核模块 Netfilter hook LOCAL OUT 在此挂钩处 仍然没有以太网标头 我构建了以太网头并且可以使用了 但是如何将其连接到skb这样我就可以将整个 skb 结构发送到dev queue xmi
  • ftrace:仅打印trace_printk()的输出

    是否可以只转储trace printk 输出于trace文件 我的意思是过滤掉函数跟踪器 或任何其他跟踪器 中的所有函数 一般来说 您可以在选项目录中关闭选项 sys kernel debug tracing options Use ls显
  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • .ko 文件是如何构建的

    我正在尝试将我自己的驱动程序移植到Beagle 板 xm arm cortex A8 在移植时我试图弄清楚如何 ko文件实际构建 在我们的Makefile我们只有一个命令来构建 o file 怎样是一个 ko文件已建立 使用Linux 2
  • 这些工作队列标志意味着什么?

    在研究工作队列时 我遇到了内核中定义的工作队列标志和常量 我有以下我无法理解的疑问 这里的排水和救援到底是什么意思 WQ DRAINING 1 lt lt 6 internal workqueue is draining WQ RESCUE
  • 何时使用 Java 中的 Writer 子类;常见做法

    我一直对 Java 中不同 IO 实现的数量感到有点困惑 现在我完全陷入了项目开发 同时我花时间阅读有用的东西 我意识到没有适合新手的比较 除了简短的解释 Writer 类的 API http download oracle com jav
  • 在 Android 上生成 FileDescriptor 而不先打开文件

    在Android中 是否可以直接从字节数组生成FileDescriptor 而不必先打开文件 在 Android 2 2 中 我动态生成 MIDI 文件 然后使用 MediaPlayer 进行播放 我在下面包含了成功执行此操作的 Main
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 过滤路径列表以仅包含文件

    如果我有一个清单FilePaths 如何过滤它们以仅返回常规文件 即不是符号链接或目录 例如 使用getDirectoryContents main do contents lt getDirectoryContents foo bar l
  • 快速写入:内存映射文件与 BufferedWriter

    有人对此进行过基准测试吗 我希望尽可能快地写入磁盘 最大限度地减少写入调用的延迟 我想知道写入内存映射缓冲区 通过 buffer put 是否比仅在 Java 端缓冲内容并在缓冲区满后刷新到 fileChannel 更快 这样 一旦缓冲区已
  • 信号处理程序内的格式化 I/O

    我想编写一个 SIGSEGV 处理程序 将消息写入文件 FILE 我听说 fprintf 不可重入 不应在信号处理程序内调用 是否有它的可重入版本 或者任何其他提供可以在信号处理程序内部调用的格式化文件 I O 的函数 否 根据C11标准N
  • 使用 STL 算法与容器(char * 除外)进行 C++ 二进制文件 I/O

    我正在尝试使用 STL 复制算法对二进制文件 I O 进行简单测试 以将数据复制到容器和二进制文件中 从容器和二进制文件中复制数据 见下文 1 include
  • 为什么在32位armv7l上mmap 4GB文件成功?

    我的印象是来自mmap 2 手册页和搜索结果 mmap仅限于系统可用的地址空间 减去系统保留的地址空间 所以在 32 位 armv7l 上 我假设它大约是 3GB 4GB 1GB 但似乎我实际上可以mmap5 GB 文件没有任何问题 int
  • Linux 内核运行稀疏失败 - /bin/sh: 1:稀疏: 未找到

    我在 Linux 内核上运行稀疏 但它会抛出以下错误 在 Linux 上运行稀疏 lovegcy knltest VirtualBox git root linux make C 2make 1 不对 all 执行任何操作 HOSTCC a
  • 在内核中创建一个简单的只写过程条目

    include
  • linux新手关于嵌入式linux设备驱动的问题

    最近在研究linux驱动 正如我读过的那些文章所说 设备驱动程序模块很可能会根据内核的需要自动加载 因此我想知道内核如何确定为特定设备 声卡 I2C spi 设备 等 我也无法彻底想象内核如何在启动时检测每个硬件设备 与嵌入式linux相关
  • System.IO.IOException:进程无法访问文件“.txt”,因为它正在被另一个进程使用

    我正在使用下一个代码来记录 Web 应用程序的错误 using StreamWriter myStream new StreamWriter sLogFilePath true myStream WriteLine string Forma
  • 没有找到合适的写入方法

    我正在尝试将先前创建的数组写入文件 这是我遇到的错误 我不知道如何修复它 Zoo java 341 error no suitable method found for write Animals outputWriter write an
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事

随机推荐

  • 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写入以避免与页面缓存相关的开销 基本上 应用程序的伪代码如下