2014年7月24日 中断门、陷阱门及中断门
中断是可以禁止的,可以通过告诉PIC停止对某个中断的发布。被禁止的中断是不会丢失的,在解除禁止后又会发送到CPU上。
禁止中断和屏蔽(mask)中断的不同之处是屏蔽是忽略掉某个中断,而禁止相当于延迟发送。
Intel提供了三种类型的中断描述符:任务门、中断门及陷阱门描述。linux使用与inten稍有不同的细分分类和术语,把他们进行如下分类:
中断门:用户态进程不能访问的一个intel中断门(DPL为0),所有的linux中断处理程序都通过中断门在内核态进行调用。
系统门:用户态进程可以访问的一个intel陷阱门(DPL为3),通过系统门来访问三个linux异常处理程序,在用户态下可以通过三个汇编指令来访问:into,bound,int $0x80。
系统中断门:用户态进程主要通过这个门来使用系统调用(DPL为3),通过int $3汇编指令来进入。
陷阱门:用户态进程不能访问的intel陷阱门(DPL为0),大部分linux异常处理程序通过这个门进入。
任务门:用户态进程不能访问的intel任务门(DPL为0),“Double Fault”(通常表示内后有严重的错误)异常使用通过这个门进入的。
2014年7月25日 中断处理
中断处理程序可以共享同一条IRQ线,每个从这条线来的中断,内核会调用每一个注册这条线上的所有的IRQ线,由中断处理程序判断是否是自己期望的设备的中断并处理这个中断。
在SMP架构上,中断的分发可以有两种方式:
静态分发:把中断信号传递给重定向表相应项所列出的本地APIC。中断立即传递给一个特定的cpu,或一组cpu或所有cpu。
动态分发:选择一个正在运行进程优先级最低的cpu。每个cpu的本地APIC里都有一个仲裁优先级寄存器,如果同时存在两个以上相同优先级的cpu,内核通过仲裁(arbitration)技术来分发中断给某个CPU来增加公平性和负载均衡,每当中断传递给一个cpu时,其相应的仲裁优先级自动置为0,其他每个cpu都优先级都增加1。当仲裁优先级寄存器大于15时,就把它置为获胜cpu前一个仲裁优先级加1。
2014年7月26日 工作队列
在linux2.6的内核中引入了工作队列,用来代替2.4的任务队列,工作队列和中断的可延迟函数类似,都只能运行在内核态并且不能访问用户态地址空间,主要不同在于可延迟函数运行在中断上下文中,工作对列则是运行在进策划那个上下文中(确切的说应该是内核线程的上下文)。工作队列通过内核线程(kthread)和等待队列(wait_queue)来实现。
由于工作队列的手动创建开销比较大,内核引入了叫做events的内核预定义工作队列,其实就是一个包包括不同内核层函数和i/o驱动程序的标准工作队列和进行了一些简单封装,并提供了一些wapper函数(schedule_work,schedule_delayed_work,schedule_delayed_work_on,flush_scheduled_work)来方便快速使用工作队列。