随笔分类 -  Linux驱动编程

摘要:中断和锁 1. 硬中断和软中断(包括tasklet和timer)共享数据,硬中断中使用spin_lock/spin_unlock,软中断中使用spin_lock_irq/spin_unlock_irq或者spin_lock_irqsave/spin_unlock_irqrestore; 硬中断可以打 阅读全文
posted @ 2019-10-29 21:52 AlexAlex 阅读(2535) 评论(0) 推荐(0) 编辑
摘要:工作队列可以把工作推后,交给一个内核线程去执行–这个下半部分总是会在进程上下文中执行;通过工作队列执行的代码占尽进程上下文的优势;最重要的是工作队列允许重新调度甚至睡眠; 在工作队列和软中断/tasklet中做出选择很容易;如果推后执行的任务需要睡眠,那么就选择工作队列;如果推后执行的任务不需要睡眠 阅读全文
posted @ 2019-10-29 21:50 AlexAlex 阅读(1255) 评论(0) 推荐(0) 编辑
摘要:多数情况下,为了控制一个寻常的硬件设备,tasklet机制都是实现自己下半部的最佳选择;tasklet可以动态创建,使用方便,执行起来还算快; 声明tasklet tasklet既可以静态的创建,也可以动态的创建;如果准备静态的创建一个tasklet,可以使用下面的两个宏之一: 1 #define 阅读全文
posted @ 2019-10-29 21:44 AlexAlex 阅读(589) 评论(0) 推荐(0) 编辑
摘要:软中断保留给系统中对时间要求严格以及最重要的下半部使用;目前,只有两个子系统(网络和SCSI)直接使用软中断;此外,内核定时器和tasklet都是建立在软中断上的;在使用软中断之前,要先确定为什么不能使用tasklet,tasklet可以动态生成,并且对加锁的要求不高,使用起来也很方便,性能也不错; 阅读全文
posted @ 2019-10-29 21:42 AlexAlex 阅读(782) 评论(0) 推荐(0) 编辑
摘要:中断处理程序的局限 1. 中断处理程序以异步的方式执行,并且它有可能会打断其他重要代码的执行,因此,为了避免被打段的代码停止时间过长,中断处理程序应该执行的越快越好; 2. 如果当前有一个中断处理程序在执行,在最好的情况下(没有设置IRQF_DISABLED),与该中断同级别的其他中断就会被屏蔽,在 阅读全文
posted @ 2019-10-29 21:40 AlexAlex 阅读(516) 评论(0) 推荐(0) 编辑
摘要:注册中断处理程序 中断处理程序是管理硬件驱动程序的组成部分;如果设备使用中断,那么相应的驱动程序就注册一个中断处理程序; 驱动程序通过request_irq()函数注册,并且激活给定的中断线,以处理中断;request_irq()函数可能会睡眠,因此,不能再中断上下文或者其他不行允许阻塞的代码中调用 阅读全文
posted @ 2019-10-29 21:37 AlexAlex 阅读(1438) 评论(0) 推荐(0) 编辑
摘要:中断 中断使得硬件可以发出通知给处理器,本质上是一种特殊的电信号,由硬件设备发向处理器,处理器接收到中断后,会马上向操作系统反应此信号的到来,然后就由操作系统负责处理这些新来的数据;硬件设备生成中断并不考虑与处理器的始终同步,中断可能随时产生,内核随时都有可能被中断打断; 不同设备的中断不同,而每个 阅读全文
posted @ 2019-10-29 21:33 AlexAlex 阅读(805) 评论(0) 推荐(0) 编辑
摘要:数组形式 支持SMP的现代操作系统使用每个cpu上的数据,对于给定的处理器其数据是唯一的;一般来说,每个cpu的数据存放在一个数组中,数组总的每一项对应着系统上的一个存在的处理器;按当前处理器号确定这个数组的当前元素;使用方式如下: 1 unsigned long my_percpu[NR_CPUS 阅读全文
posted @ 2019-10-29 21:32 AlexAlex 阅读(2099) 评论(0) 推荐(0) 编辑
摘要:vmalloc()函数的工作方式类似于kmalloc(),只不过在前者分配的内存虚拟地址是连续的,而物理地址则无须连续;这也是用户空间分配函数的工作方式:由malloc()返回的页在进程的虚拟地址空间是连续的,但是,这并不保证它们在物理RAM中也是连续的;kmalloc()函数确保页在物理地址上是连 阅读全文
posted @ 2019-10-29 19:43 AlexAlex 阅读(509) 评论(0) 推荐(0) 编辑
摘要:get_free_page 如果模块需要分配大块的内存,使用面向页的分配会有很多优点; 分配页面可使用下面的函数: 1 unsigned long get_zeroed_page(gfp_t gfp_mask) 返回指向新页面的指针并将页面清零; 1 unsigned long __get_free 阅读全文
posted @ 2019-10-29 19:41 AlexAlex 阅读(3253) 评论(0) 推荐(0) 编辑
摘要:内核中有些地方的内存分配是不允许失败的,为了确保这种情况下的成功分配,内核开发者建立了一种称为内存池的抽象;内存池其实就是某种形式的后备高速缓存,它试图始终保存空闲的内存,以便在紧急状态下使用; mempool会分配一些内存块,空闲且不会真的得到使用;因此,使用mempool很容易浪费大量内存;几乎 阅读全文
posted @ 2019-10-29 19:35 AlexAlex 阅读(643) 评论(0) 推荐(0) 编辑
摘要:设备驱动程序常常会反复的分配很多相同大小的内存块;内核实现了后备高速缓存来对此进行支持,以反复的使用这些相同的内存块; 创建 Linux内核的高速缓存管理有时被称为“slab分配器”;因此,相关函数和类型在<linux/slab.h>中声明;slab分配器实现的告诉缓存具有kmem_cache类型; 阅读全文
posted @ 2019-10-29 19:32 AlexAlex 阅读(522) 评论(0) 推荐(0) 编辑
摘要:原型 kmalloc的原型如下: 1 void *kmalloc(size_t size, gfp_t flags) 第一个参数是要分配的块的大小,第二个参数是分片标志; flags标志 最常用的标志是GFP_KERNEL,表示内存分配(最终总是调用get_free_page来实现实际的分配,这就是 阅读全文
posted @ 2019-10-29 19:17 AlexAlex 阅读(1151) 评论(0) 推荐(0) 编辑
摘要:综述 如果需要在将来的某个时间点调度执行某个动作,同时在该时间点到达之前不会阻塞当前进程,则可以使用内核定时器; 内核定时器是一个数据结构,它告诉内核在用户定义的时间点使用用户定义的参数来执行一个用户定义的函数; 被调度运行的函数几乎肯定不会再注册这些函数的进程正在执行时运行,相反,这些函数会异步的 阅读全文
posted @ 2019-10-29 19:15 AlexAlex 阅读(651) 评论(0) 推荐(0) 编辑
摘要:长延迟 有些驱动程序需要延迟比较长的时间,即长于一个时钟滴答; 忙等待 如果想把执行延迟若干个时钟滴答,或者对延迟的精度要求不高,最简单的实现方法就是一个监视jiffies计数器的循环;这种忙等待的实现方法通常具有下面形式,其中j1是延迟终止的jiffies值: 1 while (time_befo 阅读全文
posted @ 2019-10-29 19:14 AlexAlex 阅读(1707) 评论(0) 推荐(0) 编辑
摘要:墙上时间 内核一般通过jiffies来获取当前时间,该数值表示的是最近一次系统启动到当前的时间间隔,它和设备驱动程序无关,因为它的声明期只限于系统的运行期;但是驱动程序可以用jiffies来计算不同事件之间的间隔;通常,利用jiffies值来测量时间间隔已经足够了,如果要测量更短的时间差,只能使用处 阅读全文
posted @ 2019-10-29 19:09 AlexAlex 阅读(3139) 评论(0) 推荐(0) 编辑
摘要:概述 内核通过定时器中断来跟踪事件流; 时钟中断由系统定时硬件以及周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个细节结构有关的常数;作为一般性规则,即使知道对应平台上的确切HZ值,也不应该在编程时依赖该HZ值; 如果想改变系统时钟中断发生的频率,可以通过修改HZ值来进行,但是,如果修改 阅读全文
posted @ 2019-10-29 19:06 AlexAlex 阅读(695) 评论(0) 推荐(0) 编辑
摘要:尽管大多数时候阻塞型和非阻塞型操作的组合以及select方法可以有效的查询设备,但是某些时候用这种技术处理就效率不搞了; 例如:一个进程在低优先级执行长的循环计算,但又需要尽可能快的处理输入数据,如果该进程正在响应来自数据收集外设新观测的数据,则应该在新数据可用时理解知晓并处理;我们可以使用poll 阅读全文
posted @ 2019-10-29 19:01 AlexAlex 阅读(587) 评论(0) 推荐(0) 编辑
摘要:使用非阻塞IO的应用程序经常使用select,poll,epoll系统调用;它们的功能本质上是一样的:都允许进程决定是否可以对一个或者多个打开的文件做非阻塞的读取或者写入;这些电泳也会阻塞进程,直到给定的文件描述符中的任何一个可读取或者写入;因此,它们常常用于那些需要使用多个输入或者输出流而又不会阻 阅读全文
posted @ 2019-10-29 18:59 AlexAlex 阅读(1099) 评论(0) 推荐(0) 编辑
摘要:休眠简介 当一个进程被置入休眠时,它会被标记为一种特殊状态,并从调度器的运行队列中移走;直到某些情况下修改了这个状态,进程才会在任意cpu上调度,即运行该进程;休眠中的进程会被搁置在一边,等待将来的某个时间发生; 为了将进程以一种安全方式进入休眠,需要牢记下面的规则: 第一条规则,永远不要在原子上下 阅读全文
posted @ 2019-10-29 18:57 AlexAlex 阅读(1453) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示