- 1、本文档共133页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* Linux 的中断处理 优选文档 * 为什么会有中断 中断最初是为克服对I/O接口控制采用程序查询所带来的处理器低效率而产生的。 处理器速度一般比外设快很多 用轮询的方式来查询设备的状态,CPU效率不高,CPU和外设不能并行工作。 中断机制让CPU启动设备后,就去处理其他任务,只有当外设真正完成数据传输的准备,请求CPU服务的时候,CPU才转过来处理外设的请求。 优选文档 * 中断和异常 外部中断: 外部设备所发出的I/O请求。 随着计算机系统结构的不断改进以及应用技术的日益提高,中断的适用范围也随之扩大,出现了所谓的内部中断(或叫异常)。 异常: 为解决机器运行时所出现的某些随机事件及编程方便而出现的。 优选文档 * I/O中断处理 为了保证系统对外部的响应,一个中断处理程序必须被尽快的完成。因此,把所有的操作都放在中断处理程序中并不合适 Linux中把紧随中断要执行的操作分为三类 紧急的(critical)一般关中断运行。诸如对PIC应答中断,对PIC或是硬件控制器重新编程,或者修改由设备和处理器同时访问的数据 非紧急的(noncritical)如修改那些只有处理器才会访问的数据结构(例如按下一个键后读扫描码),这些也要很快完成,因此由中断处理程序立即执行,不过一般在开中断的情况下 优选文档 * I/O中断处理 Linux中把紧随中断要执行的操作分为三类 非紧急可延迟的(noncritical deferrable) 这些操作可以被延迟较长的时间间隔而不影响内核操作,有兴趣的进程将会等待数据。内核用下半部分这样一个机制来在一个更为合适的时机用独立的函数来执行这些操作。 如把缓冲区内容拷贝到某个进程的地址空间(例如把键盘缓冲区内容发送到终端处理程序进程)。 优选文档 * 自旋锁 关中断的自旋锁 Spin_lock_irq( ) Spin_unlock_irq( ) Spin_lock_irqsave ( ) Spin_unlock_irqrestore ( ) 优选文档 * 信号量 Linux中的信号量是一种睡眠锁。 如果有一个任务试图获得一个已被持有的信号量时,信号量会将其推入等待队列,然后让其睡眠。 当持有信号量的进程将信号量释放后,在等待队列中的一个任务将被唤醒,从而便可以获得这个信号量。 信号量的睡眠特性,使得信号量适用于锁会被长时间持有的情况; 信号量的操作 信号量支持两个原子操作P()和V(),前者做测试操作,后者叫做增加操作。 Linux中分别叫做down()和up()。 优选文档 * 信号量 down()和up()。 down()操作通过对信号量计数减1来请求获得一个信号量。 如果结果是0或大于0,信号量锁被获得,任务就可以进入临界区了。 如果结果是负数,任务会被放入等待队列,处理器执行其它任务。 相反,当临界区中的操作完成后,up()操作用来释放信号量,增加信号量的计数值。 如果在该信号量上的等待队列不为空,处于队列中等待的任务在被唤醒的同时会获得该信号量。 优选文档 * 信号量 优选文档 * 信号量 优选文档 * Linux信号量的实现 内核代码必须包含 asm/semaphore.h,才能使用信号量。 相关的类型是 struct semaphore 信号量的定义 struct semaphore { atomic_t count; int sleepers; wait_queue_head_t wait; } 优选文档 * Linux信号量的实现 信号量的声明和初始化 直接创建一个信号量 struct semaphore * sem; 接着使用 sema_init 来初始化这个信号量: void sema_init(struct semaphore *sem, int val); 互斥模式的信号量声明,内核提供宏定义. DECLARE_MUTEX(name); 信号量初始化为 1 DECLARE_MUTEX_LOCKED(name); 信号量初始化为0 优选文档 * Linux信号量的实现 动态分配的互斥信号量声明 void init_MUTEX(struct semaphore *sem); 信号量初始化为 1 void init_MUTEX_LOCKED(struct semaphore *sem); 信号量初始化为0 优选文档 * Linux信号量的实现 信号量的P操作 void down(struct semaphore *sem); down减小信号量的值,并根据信号量的值决定是否等待。不可中断的等待。 int down_interruptible(struct semaphore *sem); 操作是可中断的。 int
文档评论(0)