草庐IT

c - epoll_ctl : Operation not permitted error - c program

1#include2#include3#include4#include5#include6#include7#include89intmain(){10structepoll_eventevent;11intret,fd,epfd;1213fd=open("doc",O_RDONLY);14if(fd编译这段代码时,没有错误。gcc-oepollepoo.c但是当我尝试执行“epoll”程序时,我得到了错误信息epoll_ctl:Operationnotpermitted.我尝试将“doc”文件的模式更改为0777,但没有用。问题是什么?谢谢:) 最佳答案

linux - 将 DMA 缓冲区写入内存映射文件

我需要在嵌入式Linux(2.6.37)中尽可能快地将传入的DMA缓冲区写入到HD分区作为原始设备/dev/sda1。缓冲区按要求对齐,长度相等,为512KB。该过程可能会持续很长时间并填充多达例如256GB的数据。我需要使用内存映射文件技术(O_DIRECT不适用),但无法理解如何执行此操作的确切方法。所以,在伪代码“正常”写作中:fd=open(/dev/sda1",O_WRONLY);while(1){p=GetVirtualPointerToNewBuffer();if(InputStopped())break;write(fd,p,BLOCK512KB);}现在,我将非常感谢

linux - epoll_ctl() 失败 : No such file or directory [errno = 2]

最近将Linux内核从2.6.18更新到2.6.32,现有应用程序启动时出错,并显示以下错误消息:epoll_ctl()失败:没有这样的文件或目录[errno=2]。我确实通读了epoll_ctl上的linux手册页,但没有太大的意义。我想了解造成这种情况的可能原因是什么?谢谢 最佳答案 您应该给我们调用epoll_ctl的代码,但您尝试修改的文件描述符后面的套接字可能已在其他地方关闭。另见Epoll:doesitsilentlyremovefds? 关于linux-epoll_ctl(

linux - 是否有用于 FPGA 的 PCIe 的 DMA Linux 内核驱动程序示例?

我想在内核空间中编写一个驱动程序:在嵌入式系统(使用powerPC)中与通过PCIe连接的FPGA进行通信。它使用DMA将信息从FPGA传输到RAM。用户程序必须访问这些信息。我需要一些类似的例子来指导我。有人知道我在哪里可以找到一些资源吗? 最佳答案 Connectal(http://www.connectal.org)是一个开源框架,支持用户空间软件与Xilinx或AlteraFPGA通信。实际上,这种通信很少涉及设备驱动程序。Connectal支持通过内存映射硬件FIFO在软件和硬件之间传递消息,并支持通过DMA从FPGA共享

linux - Linux下的DMA和I/O内存区域

我写这篇文章是因为我对DMA的行为有一些疑问。我正在阅读有关PCI布局以及设备驱动程序如何与卡交互的信息,我还阅读了有关DMA的信息。据我了解,PCI卡没有DMAController,而不是它们请求成为总线的主控,然后它们能够获取DMA地址并在内存和设备之间进行传输(通过总线)。这个DMA地址是RAM的一部分,实际上它是一个物理地址,在什么都不做之前你需要把它转换成你的驱动程序可以使用的东西,比如内核虚拟内存。我已经用这段代码检查过了:/*Virtualkerneladdress*/kernel_buff=pci_alloc_consistent(dev,PAGE_SIZE,&dma_

linux - 如果一个文件在边沿触发调用epoll_ctl之前是可读的,那么后续的epoll_wait是否会立即返回?

如果文件在epoll_ctl调用之前已经可读,那么epoll是否保证在为EPOLLIN和EPOLLET注册文件后,第一次(或正在进行的)对epoll_wait的调用会立即返回?从我对测试程序的实验来看,答案似乎是肯定的。这里有几个例子来澄清我的问题:假设我们已经初始化了一个epoll文件efd和一个文件fd以及下面的事件定义:event.data.fd=fd;event.events=EPOLLIN|EPOLLET;现在考虑这个场景:thread1:写入数据到fdthread2:epoll_ctl(efd,EPOLL_CTL_ADD,fd,&event);thread2:epoll_w

Linux PCIe DMA 驱动程序 (Xilinx XDMA)

我目前正在使用XilinxXDMA驱动程序(请参阅此处的源代码:XDMASource),并试图让它运行(在您询问之前:我已经联系了我的技术支持联系人和Xilinx论坛到处都是有同样问题的人)。但是,我可能在Xilinx的代码中发现了一个障碍,这对我来说可能是一个交易破坏者。我希望有一些我没有考虑的事情。首先,驱动程序有两种主要模式,AXI-MemoryMapped(AXI-MM)和AXI-Streaming(AXI-ST)。对于我的特定应用,我需要AXI-ST,因为数据将持续从设备中流出。驱动程序是为利用分散-聚集列表而编写的。在AXI-MM模式下,这是有效的,因为读取是相当随机的事件

c - dma_mmap_coherent 和 remap_pfn_range 有什么区别?

目前,我正在使用exampledriver从中学习,并从中建立了自己的自定义驱动程序。mmap代码几乎完全相同,除了我允许用户管理他们自己请求的大小并以此为基础进行内存分配,以及我在/dev中自动创建字符设备这一事实。为了解释上下文,对于我的用例,我想缩小我遇到的问题的范围。dma_mmap_coherent在使用kmalloc内存时可测试地工作,但是当我有一个保留的物理地址区域时,我想使用remap_pfn_range似乎安静地工作,并且dmesg不报告任何错误,但是当我去阅读,无论我在那里写了什么,它总是返回0xff字节。无论我是在ioremap内存之后在内核态中使用iowrite

linux - 什么是 Linux 内核上下文中的 DMA 映射和 DMA 引擎?

什么是Linux内核上下文中的DMA映射和DMA引擎?什么时候可以在Linux设备驱动程序中使用DMA映射API和DMA引擎API?任何真正的Linux设备驱动程序示例作为引用都是很好的。 最佳答案 WhatisDMAmappingandDMAengineincontextoflinuxkernel?内核通常使用虚拟地址。kmalloc()、vmalloc()等函数通常返回虚拟地址。它可以存储在void*中。虚拟内存系统将这些地址转换为物理地址。这些物理地址实际上对驱动程序没有用。驱动程序必须使用ioremap()映射空间并生成虚拟

c - 如何在 linux 内核模块中分配由 1GB HugePages 支持的 DMA 缓冲区?

我正在尝试为HPC工作负载分配DMA缓冲区。它需要64GB的缓冲区空间。在计算之间,一些数据被卸载到PCIe卡上。与其将数据复制到由pci_alloc_consistent提供的一堆极小的4MB缓冲区中,不如创建64个1GB缓冲区,由1GBHugePages支持。一些背景信息:内核版本:CentOS6.4/2.6.32-358.el6.x86_64内核启动选项:hugepagesz=1ghugepages=64default_hugepagesz=1g/proc/meminfo的相关部分:AnonHugePages:0kBHugePages_Total:64HugePages_Free