Articles of linux device driver

在Beaglebone中断

我正在读取beaglebone gpio引脚的霍尔传感器输出,中断服务程序需要执行每个上升沿。 那么,如何在beaglebone中使用外部中断呢? 有没有为此目的的标准司机? 谢谢。

在添加request_mem_region之后,我的驱动程序每次首次访问都会失败,并显示“busy”消息

好的,这对我来说真的很奇怪。 我有一个模拟的CAN总线驱动程序,它是一个Linux内核模块。 然后我有一个testing应用程序在用户空间中运行,通过打开文件描述符并发送ioctl()消息来访问驱动程序。 现在,CAN总线驱动程序只是我在x86平台上运行的(它是在我们的embedded式Coldfire系统上运行的)。 在embedded式系统上,它不得不使用request_mem_region() / ioremap()来访问内存I / O区域,我不需要这样做,但是我想尽可能保持代码的通用性。 这里有一些有用的定义: #define MCF_MBAR 0x10000000 extern unsigned int Base[]; extern unsigned int can_range[]; //This is the CAN registers on coldfire, just unused on my x86 desktop Base[minor] = (MCF_MBAR + 0x1c0000); can_range[minor] = 0x180; 然后在init中我们这样做: if(NULL == request_mem_region(Base[minor], can_range[minor], "CAN-IO")) { return -EBUSY; } can_base[minor] = ioremap(Base[minor], […]

打印到内核日志的限制

我正在研究Linux设备驱动程序(内核版本2.6.32-37)。 我主要通过打印到内核日志(使用printk)来debugging我的代码。 一切顺利,直到我的电脑突然停止响应。 我一遍又一遍地检查过,我的代码似乎是正确的。 我的问题是: 是否有可能太多打印到内核日志可能会导致计算机停止响应? 非常感谢! 奥马尔

Linux驱动程序:mmap()内核缓冲区到用户空间,而不使用nopage

我为数据采集设备实现了一个Linux设备驱动程序,该设备不断将数据stream传输到我在内核中分配的循环缓冲区中(使用__get_free_pages() )。 循环缓冲区(由PCIe硬件写入)驻留在RAM中,我希望用户空间能够将RAM区域mmap()以便用户空间可以读取其内容。 根据LDD3: remap_pfn_range的一个有趣的限制是它只允许访问物理内存顶部的保留页面和物理地址。 …因此,remap_pfn_range将不允许您重新映射常规地址,其中包括通过调用get_free_page获得的地址。 …真正的RAM映射到用户空间的方法是使用vm_ops->nopage来一次处理页面错误。 在我的情况下,我确切地知道在mmap()被调用的时刻,哪些地址需要被映射到给定的VMA位置上,所以为什么我必须使用nopage()一页一页地访问? 为什么我不能设置我的VMA,以便我的环形缓冲区的全部内容立即映射到用户的地址空间中? 有没有办法做到这一点? 我也希望用户空间程序能顺序地访问我的缓冲区,当每次跨越页面边界时调用nopage()函数时会导致性能nopage() 。 这是否会在实践中造成相当大的性能下降? (我的缓冲区很大,比如16 MB) (值得注意的是,我在之前的设备驱动程序之一中使用了从__get_free_pages()返回的内存上的remap_pfn_range() ,并且从来没有任何问题,但是我可能刚刚在该系统上运气remap_pfn_range() 。

PCI / PCIe设备如何在Linux内核中启动/注册自己?

内核启动时,PCI子系统为每个物理PCI总线创build一个pci_bus ,然后将pci_bus添加到pci_root_buses (使用PCIconfiguration)。 但PCI设备驱动程序通过pci_register_driver注册驱动程序,并将PCI驱动程序添加到pci_bus_type 。 我的问题: pci_bus_type如何知道PCIconfiguration。 pci_bus_type和pci_root_buses之间有什么关系?

Linuxnetworking驱动程序MSI中断问题

我正在尝试为自定义硬件创build一个networking驱动程序。 我针对Xilinx Zync-7000 FPGA器件。 我的问题是在CPU端处理MSI中断的软件。 我遇到的问题是在PCIe设备上触发中断时,驱动程序代码会执行一次中断处理程序,然后返回,但是当我查看lspci时,PCIe IO停止工作,MSI被重置。 任何未来的中断都不会被内核捕获,PCIe开发几乎已经死了。 我检查了硬件,并没有重新发布到FPGA,所以我在想内核正在发生什么事情。 先谢谢你。

Linux内核设备驱动程序需要访问用户空间中的共享对象

我正在尝试为Linux编写networking设备驱动程序。 我所拥有的设备具有可用的API,可以通过用户空间中存在的共享对象访问我需要的所有function。 我想写一个networking驱动程序,使我可以使设备显示为一个CAN接口。 但是,为了与设备进行交互,我需要使用用户空间中存在的特定共享对象。 我需要一个networking设备驱动程序的原因是公开一个可以通过SocketCAN实用程序进行交互的CAN接口。 有没有办法,我可以在用户空间编写networking设备驱动程序? 或者,什么是我devise解决scheme的最佳方式? TL;博士 需要为一个设备驱动程序写一个设备驱动程序,这个设备驱动程序只能通过提供的暴露API的共享对象与用户空间交互。 我需要将设备显示为networking接口,以便利用SocketCAN实用程序和其他在Linux中与CAN接口进行通信的应用程序。 我在这里有什么select? 我能做什么? 谢谢!

将数据从内核缓冲区移到中断处理程序的用户空间缓冲区

新手到Linux内核和驱动程序开发这里。 我有一个从pcie设备进来的中断数据。 每次检测到中断时,我都希望驱动程序将数据从位于驱动程序中的缓冲区复制到用户空间的大缓冲区中。 用户应用程序不应该为驱动程序“轮询”新数据。 目前我的中断处理程序试图将数据copy_to_user()传递给用户空间。 但是,这失败了。 copy_to_user()总是返回n ,其中n是我希望复制的字节数。 我的猜测是调用中断处理程序导致上下文切换导致副本失败? 我应该如何去做到这一点? 谢谢!

Objdump -S不显示Linux内核模块的源代码列表

我试图从我的内核模块debugging崩溃; 我试图获得源代码列表与输出的objdump,但它不列出。 有什么我失踪? mips-linux-objdump -S <filename.o> > temp

等待队列与信号量在Linux中

为什么我们在linux内核中使用等待队列而不是使用信号量进行同步? 使用等待队列和信号量进行同步有什么区别?