摘要: 1. 当一个设备无法立刻满足用户的读写请求时(例如调用read时,设备没有数据提供),驱动程序应当(缺省的)阻塞进程,使它进入等待(睡眠)状态,知道请求可以得到满足。 2. Linux内核等待队列:在实现阻塞驱动的过程中,需要有一个“候车室”来安排被阻塞的进程“休息”,当唤醒它们的条件成熟时,则可以 阅读全文
posted @ 2018-08-23 16:32 99度的水 阅读(482) 评论(0) 推荐(0) 编辑
摘要: 1. Linux内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c 文件中。 2. 被调度的函数是异步执行的,它类似于一种“软件中断”,而且是处于非进程的上下文中,所以调度函数必须遵守 阅读全文
posted @ 2018-08-21 13:09 99度的水 阅读(387) 评论(0) 推荐(0) 编辑
摘要: 1. 工作队列是一种将任务推后执行的方式,它把推后的任务交由一个内核线程去执行。这样中断的下半部会在进程上下文执行,他允许重新调度甚至睡眠。每个被推后的任务叫做“工作”,由这些工作组成的队列称为工作队列。 2. Linux内核使用struct workqueue_struct来描述一个工作队列 3. 阅读全文
posted @ 2018-08-20 22:45 99度的水 阅读(375) 评论(0) 推荐(0) 编辑
摘要: 1. Linux中断分层 (1)上半部:当中断发生时,它进行相应的硬件读写,并“登记”该中断。通常由中断处理程序充当上半部。(一般情况下,上半部不可被打断) (2)下半部:在系统空闲的时候,对上半部“登记”的中断进行后续处理(“延迟处理”) 2. 对于中断下半部的实现方式一共有三种 (1)软中断 ( 阅读全文
posted @ 2018-08-20 17:21 99度的水 阅读(423) 评论(0) 推荐(0) 编辑
摘要: 1. 函数线程安全 ① 函数线程安全基本定义 (1)线程安全:多个线程并发执行同一函数时,不会出现不同的结果,我们就说该函数是线程安全的 (2)线程不安全:如果多线程并发执行同一函数时会产生不同的结果,则称该函数是线程不安全的 注:线程不安全的原因大多说是因为对全局变量和静态变量的操作 ② 常见线程 阅读全文
posted @ 2018-08-20 16:11 99度的水 阅读(536) 评论(0) 推荐(0) 编辑
摘要: 1. 中断处理流程 当中断发生时,Linux系统会跳转到asm_do_IRQ()函数(所有中断程序的总入口函数),并且把中断号irq传进来。根据中断号,找到中断号对应的irq_desc结构(irq_desc结构为内核中中断的描述结构,内核中有一个irq_desc结构的数组irq_desc_ptrs[ 阅读全文
posted @ 2018-08-19 18:47 99度的水 阅读(11651) 评论(0) 推荐(0) 编辑
摘要: 1. Linux混杂设备驱动模型 ① 在Linux系统中,存在一类字符设备,它们拥有相同的主设备号(10),但次设备号不同,我们称这类设备为混杂设备(miscdevice)。所有混杂设备形成一个链表,对设备访问时内核根据次设备号查找相应的混杂设备。 ② Linux中使用struct miscdevi 阅读全文
posted @ 2018-08-19 16:02 99度的水 阅读(355) 评论(0) 推荐(0) 编辑
摘要: ①驱动源码 ② Makefile ③ 应用层测试代码 ④ 测试步骤 (1)安装驱动模块:Led.ko (2)查看主设备号:cat /proc/devices(查找led对应的主设备号) (3)创建设备文件:mknod /dev/led c 主设备号 0 (4)运行测试代码进行测试 阅读全文
posted @ 2018-08-19 09:01 99度的水 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 1. Linux字符设备是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open、close、read和write系统调用。例如:串口、Led、按键等。 2. 通过字符设备文件(/dev/xxx),应用程序可以使用相应的字符设备驱动来控制字符设备 3. 创建字符设备文件的方法 阅读全文
posted @ 2018-08-18 18:33 99度的水 阅读(17662) 评论(0) 推荐(0) 编辑
摘要: ① 驱动程序控制设备,主要是通过访问设备内的寄存器来达到控制目的。因此我们讨论如何访问硬件,就成了如何访问这些寄存器。 ② 在Linux系统中,无论是内核程序还是应用程序,都只能使用虚拟地址,而芯片手册中给出的硬件寄存器地址或者Ram地址则是物理地址,无法直接使用。因此,我们读写寄存器的第一步就是将 阅读全文
posted @ 2018-08-18 12:23 99度的水 阅读(383) 评论(0) 推荐(0) 编辑