【linux驱动程序中的并发控制】教程文章相关的互联网学习教程文章

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

这个问题已经在这里有了答案: > Mapping DMA buffers to userspace [closed] 5个我正在为数据获取设备实现Linux设备驱动程序,该设备不断将数据流到在内核中分配的循环缓冲区中(使用__get_free_pages()).循环缓冲区(由PCIe硬件写入)位于RAM中,我希望用户空间能够mmap()该RAM区域,以便用户空间可以读取其内容. 根据LDD3:An interesting limitation of remap_pfn_range i...

Linux网络驱动程序MSI中断问题【代码】

我正在尝试为自定义硬件创建网络驱动程序.我的目标是Xilinx Zync-7000 FPGA器件. 我的问题是CPU端MSI中断的软件处理.我遇到的问题是,当在PCIe设备上触发中断时,驱动程序代码会执行一次中断处理程序并返回,但是当我查看lspci时,PCIe IO会停止工作,并且MSI将重置.内核不会捕获任何将来的中断,PCIe开发人员几乎已经死了.我检查了硬件,没有复位信号发给FPGA,所以我认为内核中发生了某些事情. 先感谢您.解决方法:发布此问题后,我发现问题...

如何获得Linux设备驱动程序的免费次要号码?

我的Linux环境中有多个进程,这些进程必须使用相同的设备驱动程序来访问许多相似的设备.我的问题是,如果一个进程实例化一个设备(通过实例化,我的意思是mknod)文件,并且为两个设备使用一个较小的数字(例如0和1).那么,其他进程在做同一件事时又如何知道要使用哪个次要号码呢? 简而言之,在应用程序空间中是否可以找到使用同一驱动程序的设备文件数量?解决方法:假设您引用的是正在创建的驱动程序,或者至少具有源代码,请尝试以数字顺序...

linux-使用wait_event_interruptible_timeout判断设备驱动程序超时是否发生

在设备驱动程序中,我正在使用wait_event_interruptible_timeout.如何判断是否发生超时?该宏仅在中断时返回错误代码,但超时不是中断,因此返回“ 0”. 编辑:不确定如何判断是否发生超时,但是条件不会被设置,所以听起来像答案.解决方法:在几周前阅读Linux Device Drivers, Third Edition中对该函数的描述后,我遇到了同样令人困惑的问题.但是,在阅读了当前内核源代码树中各种wait函数的注释之后,我发现自本书以来,API发生了变化已出版...

未调用Linux DevFreq驱动程序中的探测【代码】

我正在尝试为Linux上的外围设备设置devfreq驱动程序.我对驱动程序的初始化方法如下:static struct platform_driver zynq_csortfreq_driver = {.probe = zynq_csortfreq_probe,.driver = {.name = "ZYNQ_CSORT_DEVFREQ",.owner = THIS_MODULE,},};static int __init zynq_csortfreq_init(void) {return platform_driver_register(&zynq_csortfreq_driver); } late_initcall(zynq_csortfreq_init);但是,驱动程序中的探测函数(zy...

如何确定哪些驱动程序可用于php中的odbc(在Linux系统上)?【代码】

在PHP脚本中,看起来这是连接到odbc数据库的方式:$connection = odbc_connect("Driver={SQL Server Native Client 10.0};Server=$server;Database=$database;", $user, $password);我遇到的问题是我不知道将什么用于“ Driver =“.我输入的内容是为我看到的另一个脚本提供的.在我的脚本中,我要做的就是尝试使用此行进行连接,但出现以下错误:Warning: odbc_connect(): SQL error: [unixODBC][Driver Manager]Data source name not ...

Linux设备驱动程序 之 中断和锁

中断和锁 1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore; 硬中断可以打断软中断,所以软中断中访问共享数据需要禁止中断;考虑如下情况,当软中断中获取到锁,之后被硬中断打断,硬中断此时尝试获取锁,因为锁已经被软中断持有,硬中断获取不到,产生死锁; 2. 硬中断和进程上下文共享数据,硬中断...

Linux设备驱动程序 之 软中断【代码】

软中断保留给系统中对时间要求严格以及最重要的下半部使用;目前,只有两个子系统(网络和SCSI)直接使用软中断;此外,内核定时器和tasklet都是建立在软中断上的;在使用软中断之前,要先确定为什么不能使用tasklet,tasklet可以动态生成,并且对加锁的要求不高,使用起来也很方便,性能也不错;当然,对于时间要求严格并能自己高效完成加锁的工作,软中断是正确的选择; 分配索引 在编译期间,通过在<linux/interrupt.h>中定义一...

Linux设备驱动程序 之 tasklet【代码】

多数情况下,为了控制一个寻常的硬件设备,tasklet机制都是实现自己下半部的最佳选择;tasklet可以动态创建,使用方便,执行起来还算快; 声明tasklet tasklet既可以静态的创建,也可以动态的创建;如果准备静态的创建一个tasklet,可以使用下面的两个宏之一:1 #define DECLARE_TASKLET(name, func, data) 2 struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data } 3 4 #define DECLARE_TASKLET_DISABLED(name, ...

Linux设备驱动程序 之 ioctl【代码】

ioctl 除了读取和写入设备之外,大部分驱动程序还需要另外一种能力,即通过设备驱动程序执行各种类型的硬件控制,通常这种需求使用ioctl方法支持,该方法实现了同名的系统调用; 在用户空间,ioctl系统调用的原型如下:1 int ioctl(int d, int request, ...);原型中的可变参数不是数目不定的一串参数,而只是一个可选参数;可选参数的具体格式依赖于控制命令,也就是第二个参数;某些控制命令不需要参数,某些需要一个整数参数,某...

Linux设备驱动程序 之 休眠【代码】

休眠简介 当一个进程被置入休眠时,它会被标记为一种特殊状态,并从调度器的运行队列中移走;直到某些情况下修改了这个状态,进程才会在任意cpu上调度,即运行该进程;休眠中的进程会被搁置在一边,等待将来的某个时间发生; 为了将进程以一种安全方式进入休眠,需要牢记下面的规则: 第一条规则,永远不要在原子上下文中进入休眠;原子上下文是指下面这种状态:在执行多个步骤时,不能有任何的并发访问;这意味着,对休眠来讲,我...

Linux设备驱动程序 之 顺序锁【代码】

当要保护的资源很小,很简单,会频繁的被访问而且写入访问很少的且必须快速时(即读不允许让写饥饿),就可以使用顺序锁(seqlock);从本质上讲,顺序锁会允许读取者对资源的自由访问,但需要读取者检查是否和写入者发生冲突,当这种冲突发生时,就需要重试对资源的访问; 顺序锁通常不能用于保护包含指针的数据结构,因为在写入者修改该数据结构的同时,读取这可能会追随一个无效指针; seqlock定义在<linux/seqlock>中,通常用于初...

Linux设备驱动程序 之 RCU机制【代码】

读取-复制-更新(read-copy-update,RCU)是一种高级的互斥机制,在正确的条件下,可以获得高的性能; RCU对它保护的数据结构做了一些限定,它针对经常发生读而很少发生写的情况做了优化,被保护的资源应该通过指针访问,而对这些资源的引用必须仅由原子代码拥有,在RCU保护的代码范围内不能进入睡眠状态;在修改该数据结构时,写入线程首先复制,然后修改副本,之后用新的版本替换相关指针,当内核确信老的版本上没有其他引用时,...

Linux设备驱动程序 之 信号量和互斥体【代码】

概念 一个信号量本质是一个整数值,它和一堆函数联合使用,这一对函数通常称为P和V;希望进入临界区的进程将在相关信号量上调用P;如果信号量的值大于零,则该值会减少1,进程可以继续执行;相反,如果信号量的值为0或者更小,则进程必须等待知道其他人释放该信号量;对信号量的解锁通过调用V完成;该函数增加信号量的值,并在必要时唤醒等待的进程; 当信号量用于互斥时(即避免多个进程同时在一个临界区中运行),信号量 的值应该...

Linux设备驱动程序 之 Makefile【代码】

典型的模块Makefile如下所示; 1 ifneq ($(KERNELRELEASE),)2 obj-m := hello.o3 else4 KERNELDIR ?=/lib/modules/$(shell uname -r)/build5 PWD :=$(shell pwd)6 default:7 $(MAKE) -C $(KERNELDIR) M=$(PWD) modules8 clean:9 @rm -rf *.o *.mod.c *.ko *.symvers *.order *.makers 10 endif 该Makefile在构造过程中会被读取两次;执行步骤如下: 1. 当Makefile从命令行调用时,它注意...