FreeBSD6.2中断

2009-05-13 11:10:43来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

FreeBSD6.2中断
qiuhan
2007.9.10
本文参考了《FreeBSD 5 内核源代码分析之中断处理》,转载请注明,谢谢!
FreeBSD6.2中断处理程序是在线程的上下文中运行的,如果是快速中断,则直接在
当前进程的上下文运行; 否则,设置相应内核中断线程的状态,并等待线程调度来执行
中断线程(由于中断线程优先级很高,不会等的心碎)
与之前的版本有所不同,6.2不是在注册中断源的时候为其创建内核中断线程,而是在
真正为中断添加处理方法的时候根据是否快速中断来选择是否创建中断线程,这样可以
避免资源浪费,例如有些irq中断很可能没有处理程序。为此6.2中增加了一种结构
intr_event来替代结构中断线程ithd在结构中断源intsrc中的位置,并使用
#define ithd        intr_event
来保持兼容。而现在的结构中断线程只能改名叫intr_thread(但愿有人会因为你的
改名而喜欢上你)
重要数据结构:
===========
struct intsrc {
    struct pic *is_pic;  //中断源对应的中断控制器(见下)
    struct intr_event *is_event; //中断事件
    ...
};
中断源就是一个纽带,连接了中断控制器和中断事件。中断处理函数最喜欢的就是它。
所有的中断源都会通过intr_register_source注册到如下数组中:
static struct intsrc *interrupt_sources[NUM_IO_INTS];
#define NUM_IO_INTS 255 //之前的版本中该值为191
struct pic {
    void (*pic_enable_source)(struct intsrc *);
    void (*pic_disable_source)(struct intsrc *, int);
    void (*pic_eoi_source)(struct intsrc *);
    void (*pic_enable_intr)(struct intsrc *);
    int (*pic_vector)(struct intsrc *);
    int (*pic_source_pending)(struct intsrc *);
    void (*pic_suspend)(struct pic *);
    void (*pic_resume)(struct pic *);
    int (*pic_config_intr)(struct intsrc *, enum intr_trigger,
        enum intr_polarity);
    void (*pic_assign_cpu)(struct intsrc *, u_int apic_id);
    STAILQ_ENTRY(pic) pics;
};
pic(programmable interrupt controller)可以为8259A,I/O APIC。
该结构标识的是中断控制器的方法,如,pic_vector取得中断向量,
pic_eoi_source中断结束。正如你所预料,每个中断控制器的操作方法不一样,
所以需要这种类似MAC的钩子函数。所有的pic都会通过intr_register_pic
注册到全局的链表pics中:
static STAILQ_HEAD(, pic) pics;
struct intr_event {
    ...
    TAILQ_HEAD(, intr_handler) ie_handlers; /* Interrupt handlers. */
    ...
    struct intr_thread *ie_thread;  /* Thread we are connected to. */
    ...
};
中断事件。ie_handlers保存着中断处理方法(Interrupt handlers)的链表,中断处理时
会依次调用该链表中挂载的函数。ie_thread是该中断事件对应的中断线程(只有在ie_handlers
中存在非快速中断时才会存在该中断的内核中断线程。)
struct intr_handler {
    driver_intr_t   *ih_handler;    /* Handler function. */

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:bsd sysctl.conf优化

下一篇:CRUX