博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中断触发流程二
阅读量:4104 次
发布时间:2019-05-25

本文共 3360 字,大约阅读时间需要 11 分钟。

2012-07-24 10:16 by 至上, 18 阅读, 0 评论, ,

主要讲下两个结构体及其关系和在系统中所处的位置:

每一个中断线或者叫中断向量都对应一个desc结构体,系统中所有的desc组成一个结构体数组。

struct irq_desc {        unsigned int            irq;        struct timer_rand_state *timer_rand_state;        unsigned int            *kstat_irqs;#ifdef CONFIG_INTR_REMAP        struct irq_2_iommu      *irq_2_iommu;#endif        irq_flow_handler_t      handle_irq;   //每个中断线都有一个中断处理程序        struct irq_chip         *chip;        //包含一些中断开关  屏蔽等工作        struct msi_desc         *msi_desc;        void                    *handler_data;        void                    *chip_data;        struct irqaction        *action;        /* IRQ action list */   //中断子程序链表        unsigned int            status;         /* IRQ status */        //说明这个中断线是否可以被共享        unsigned int            depth;          /* nested irq disables */        unsigned int            wake_depth;     /* nested wake enables */        unsigned int            irq_count;      /* For detecting broken IRQs */        unsigned long           last_unhandled; /* Aging timer for unhandled count */        unsigned int            irqs_unhandled;        spinlock_t              lock;#ifdef CONFIG_SMP        cpumask_var_t           affinity;        unsigned int            node;#ifdef CONFIG_GENERIC_PENDING_IRQ        cpumask_var_t           pending_mask;#endif#endif        atomic_t                threads_active;    //这里的线程是怎么回事呢?        wait_queue_head_t       wait_for_threads;#ifdef CONFIG_PROC_FS        struct proc_dir_entry   *dir;#endif        const char              *name;} ____cacheline_internodealigned_in_smp;
struct irq_chip {        const char      *name;        unsigned int    (*startup)(unsigned int irq);        void            (*shutdown)(unsigned int irq);        void            (*enable)(unsigned int irq);        void            (*disable)(unsigned int irq);        void            (*ack)(unsigned int irq);        void            (*mask)(unsigned int irq);        void            (*mask_ack)(unsigned int irq);        void            (*unmask)(unsigned int irq);        void            (*eoi)(unsigned int irq);        void            (*end)(unsigned int irq);        int             (*set_affinity)(unsigned int irq,                                        const struct cpumask *dest);        int             (*retrigger)(unsigned int irq);        int             (*set_type)(unsigned int irq, unsigned int flow_type);        int             (*set_wake)(unsigned int irq, unsigned int on);        void            (*bus_lock)(unsigned int irq);        void            (*bus_sync_unlock)(unsigned int irq);        /* Currently used only by UML, might disappear one day.*/#ifdef CONFIG_IRQ_RELEASE_METHOD        void            (*release)(unsigned int irq, void *dev_id);#endif        /*         * For compatibility, ->typename is copied into ->name.         * Will disappear.         */        const char      *typename;};
struct irqaction {    //每一个中断例程对应一个irqaction,都放在链表中        irq_handler_t handler;   //这个结构体里面应该有指向中断子程序的指针        unsigned long flags;        const char *name;        void *dev_id;    //在中断共享时用与区分中断子程序的        struct irqaction *next;   //链表中指向下一个例程        int irq;              //中断号        struct proc_dir_entry *dir;        irq_handler_t thread_fn;     //好奇怪  这里也有线程相关        struct task_struct *thread;        unsigned long thread_flags;};

转载地址:http://pkbsi.baihongyu.com/

你可能感兴趣的文章
linux 内核—进程的地址空间(1)
查看>>
存储器管理(二)
查看>>
开局一张图,学一学项目管理神器Maven!
查看>>
Android中的Binder(二)
查看>>
Framework之View的工作原理(一)
查看>>
Web应用架构
查看>>
设计模式之策略模式
查看>>
深究Java中的RMI底层原理
查看>>
用idea创建一个maven web项目
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
DES加解密
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>