⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 interrupt.h.txt

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻 TXT
字号:
any question,send email to netxiong@263.net


*********************************基本的数据结构*************************************
(1):struct softirq_action
    {
        void    (*action)(struct softirq_action *);
        void    *data;
    };
bottom half的处理函数的位置,其中的action就是相对于irq_stat中的相应的处理函数。


enum
{
        HI_SOFTIRQ=0,
        NET_TX_SOFTIRQ,
        NET_RX_SOFTIRQ,
        TASKLET_SOFTIRQ		//嵌套tasklet结构。
};
目前irq_stat共有四项,用open_softirq来进行初始化。
这个数据结构提供给open_softirq来进行初始化。


enum {
	TIMER_BH = 0,
 	TQUEUE_BH,
	DIGI_BH,
        SERIAL_BH,
        RISCOM8_BH,
        SPECIALIX_BH,
        AURORA_BH,
        ESP_BH,
        SCSI_BH,
        IMMEDIATE_BH,
        CYCLADES_BH,
        CM206_BH,
        JS_BH,
        MACSERIAL_BH,
        ISICOM_BH
};

enum
{
        TASKLET_STATE_SCHED,    /* Tasklet is scheduled for execution */
        TASKLET_STATE_RUN       /* Tasklet is running (SMP only) */
};
这里有三个enum的定义,实际上是一个迁套的结构.




struct tasklet_struct
{
        struct tasklet_struct *next;	
        unsigned long state;
        atomic_t count;
        void (*func)(unsigned long);	//处理函数。
        unsigned long data;		//处理函数的参数。
};

struct tasklet_head
{
        struct tasklet_struct *list;
} __attribute__ ((__aligned__(SMP_CACHE_BYTES)));
以上这两个结构,下面的是构成tasklet_vec[NR_CPUS]的结构,也就是相对于每一个CPU一个的结构,从而组成了tasklet队列。队列中的每一个成员的结构都是tasklet_struct型的。

************************************************************************************



********************************对active位进行设置的位******************************
(1):static inline void mark_bh(int nr)
仅仅调用tasklet_hi_schedule(bh_task_vec+nr);

###注意:这里的mark_bh和原来的mark_bh有着本质的区别,正是这个mark_bh把原来的bh_base和现在的tasklet联系了起来。实际上现在的bh_base处理函数都归结到了taslet_hi_action中去了。只要对HI_SOFTIRQ置位,就执行tasklet_hi_action,也就执行了连接在tasklet_hi_vec之后的链表中去了。


(2):static inline void tasklet_hi_schedule(struct tasklet_struct *t)
	 t->next = tasklet_hi_vec[cpu].list;
	 tasklet_hi_vec[cpu].list = t;
         __cpu_raise_softirq(cpu, HI_SOFTIRQ); //这个函数设置HI_SOFTIRQ位。

(3):static inline void __cpu_raise_softirq(int cpu, int nr)
        softirq_active(cpu) |= (1<<nr);    //设置相应的位。1<<nr就是对相应的位置1。

************************************************************************************



********************************将tasklet加入到tasklet队列中的函数*******************
这里的tasklet就是一个等待bottom half处理的tasklet_struct结构的变量。

(1):static inline void tasklet_schedule(struct tasklet_struct *t)
	 t->next = tasklet_vec[cpu].list;
	 tasklet_vec[cpu].list = t;		//将新的tasklet_strcut结构加入到链表中去。
	__cpu_raise_softirq(cpu, TASKLET_SOFTIRQ);	//对相应的位置位。

(2):static inline void tasklet_hi_schedule(struct tasklet_struct *t)
	两者的实现方法一样。
*************************************************************************************

















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -