通过<手把手教Linux驱动1-模块化编程,玩转module>的学习,我们已经掌握了如何向内核加载一个模块,现在我们学习模块之间如何传递参数. 一.给模块传递参数 当我们加载一个模块到Linux内核的时候,Linux内核允许向这个模块传递一些参数.这样设计的好处就是,让我们的模块操作起来更灵活,我们可以通过给它传递不同的参数来完成不同的功能.例如:我们写一个模块程序,来完成硬件中断的操作.在Linux操作系统中,每个中断都有一个中断号.如果我们在模块里面将中断号写死,那我们的模块只能响应特定的…
大家好,从本篇起,一口君将手把手教大家如何来学习Linux驱动,预计会有20篇关于驱动初级部分知识点.本专题会一直更新,有任何疑问,可以留言或者加我微信. 一.什么是模块化编程? Linux的开发者,遍布世界各地,他们相互之间觉大数估计都不认识.如果真的是对这些开发者进行统一管理,那是很难做到的.所以大牛们,在设计Linux内核的时候,融入了模块化的思想.也就是说,现在大家已经有一个现成的Linux操作系统了,所有的开发者写的代码对于这个Linux操作系统而言都是一个模块,开发者可以模块的形式将…
一.Linux设备分类 Linux系统为了管理方便,将设备分成三种基本类型: 字符设备 块设备 网络设备 字符设备: 字符(char)设备是个能够像字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性.字符设备驱动程序通常至少要实现open.close.read和write的系统调用. 字符终端(/dev/console)和串口(/dev/ttyS0以及类似设备)就是两个字符设备,它们能很好的说明“流”这种抽象概念. 字符设备可以通过文件节点来访问,比如/dev/tty1和/de…
1. 自旋锁 Linux内核中最常见的锁是自旋锁.一个自旋锁就是一个互斥设备,它只能有两个值:"锁定"和"解锁".如果锁可用,则"锁定"位被设置,而代码继续进入临界区:相反,如果锁被其他进程争用,则代码进入忙循环并重复检查这个锁,直到锁可用为止.这个循环就是自旋锁的"自旋".自旋锁最多只能被一个可执行的线程持有.如果一个执行线程试图获得一个被争用的自旋锁,那么该线程就会一直进行忙循环-旋转-等待锁重新可用.注意,同一个锁可以用…
自旋锁(Spin Lock) 自旋锁类似于互斥量,不过自旋锁不是通过休眠阻塞进程,而是在取得锁之前一直处于忙等待的阻塞状态.这个忙等的阻塞状态,也叫做自旋. 自旋锁通常作为底层原语实现其他类型的锁. 适用场景: 1)锁被持有的时间短,而且线程不希望在重新调度上花费太多的成本: 2)在非抢占式内核中,会阻塞中断,这样中断处理程序不会让系统陷入死锁状态.因为中断处理程序无法休眠,只能使用这种锁: 缺点: 1)线程自旋等待锁变成可用时,CPU不能做其他事情,会浪费CPU资源: 伪代码 S = 1 线程…
在多线程环境中,多个线程可能会同时访问同一个资源,为了避免访问发生冲突,可以根据访问的复杂程度采取不同的措施 原子操作适用于简单的单个操作,无锁算法适用于相对简单的一连串操作,而线程锁适用于复杂的一连串操作 原子操作 修改状态要么成功且状态改变,要么失败且状态不变,并且外部只能观察到修改前或者修改后的状态,修改中途的状态不能被观察到 .NET 中,System.Threading.Interlocked 类提供了用于执行原子操作的函数,这些函数接收引用参数(ref),也就是变量的内存地址,然后针…
在多线程环境中,多个线程可能会同时访问同一个资源,为了避免访问发生冲突,可以根据访问的复杂程度采取不同的措施 原子操作适用于简单的单个操作,无锁算法适用于相对简单的一连串操作,而线程锁适用于复杂的一连串操作 原子操作 修改状态要么成功且状态改变,要么失败且状态不变,并且外部只能观察到修改前或者修改后的状态,修改中途的状态不能被观察到 .NET 中,System.Threading.Interlocked 类提供了用于执行原子操作的函数,这些函数接收引用参数(ref),也就是变量的内存地址,然后针…
为了避免并发,防止竞争.内核提供了一组同步方法来提供对共享数据的保护. 我们的重点不是介绍这些方法的详细用法,而是强调为什么使用这些方法和它们之间的差别. Linux 使用的同步机制可以说从2.0到2.6以来不断发展完善.从最初的原子操作,到后来的信号量,从大内核锁到今天的自旋锁.这些同步机制的发展伴随 Linux从单处理器到对称多处理器的过度:伴随着从非抢占内核到抢占内核的过度.锁机制越来越有效,也越来越复杂.目前来说内核中原子操作多用来做计数使用,其它情况最常用的是两种锁以及它们的变种:一个…
目录 自旋锁作用与基本使用方法? 在SMP和UP上的不同表现? 自旋锁与上下文 使用spin_lock()后为什么不能睡眠? 强调:锁什么? 参考   1.自旋锁作用与基本使用方法? 与其他锁一样,自旋锁也用于保护临界区,但是自旋锁主要是用于在SMP上保护临界区.在SMP上,自旋锁最多只能被一个可执行线程持有,如果一个线程尝试获得一个被争用的自旋锁,该线程将一直旋转(while循环)直到锁可用:如果锁未被争用,请求锁的执行线程将立刻争用它,并继续执行.   LINUX下自旋锁的基本使用方法: 声…
自旋锁 自旋锁最多只能被一个内核任务持有.要是锁未被持有,请求它的内核任务便会立即得到它并继续执行.如果一个内核任务试图请求一个已经被别的内核任务持有的自旋锁,那么CPU就会一直尽心循环---旋转---等待锁重新可用. Spinlock_t my_lock = SPIN_LOCK_UNLOCKED; 或者在运行时使用: Void spin_lock_init(spinlock_t *lock); 得到自旋锁: Void spin_lock(spinlock *lock); 释放自旋锁: Void…