//解除安裝irq鍊錶中與輸入引數相對應的 irqaction 描述符
void remove_irq(unsigned int irq, struct irqaction *act)
//動態申請及註冊乙個中斷(動態建立乙個irqaction描述符,把該描述
//符加入到irq鍊錶中)
//0-建立成功 -16-中斷號被占用
static inline int __must_check
request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,
const char *name, void *dev)
int request_threaded_irq(unsigned int irq , irq_handler_t handler,
irq_handler_t thread_fn, unsigned long irqflags,
const char *devname , void *dev_id)
action = kzalloc(sizeof(struct irqaction), gfp_kernel);
if (!action)
return -enomem;
action->handler = handler;
action->thread_fn = thread_fn;
action->flags = irqflags;
action->name = devname;
action->dev_id = dev_id;
chip_bus_lock(desc);
retval = __setup_irq(irq, desc, action);
chip_bus_sync_unlock(desc);
if (retval)
kfree(action);
#ifdef config_debug_shirq_fixme
if (!retval && (irqflags & irqf_shared))
#endif
return retval;
}//將乙個中斷描述符加入到irq鍊錶中
int setup_irq(unsigned int irq, struct irqaction *act)
//將 tasklet_struct 的count欄位加1,使軟中斷睡眠,不能響應對應的
//中斷
//tasklet_enable相反
static inline void tasklet_disable(struct tasklet_struct *t)
static inline void tasklet_enable(struct tasklet_struct *t)
//初始化乙個 struct tasklet_struct 軟中斷結構體變數,將其 state 和
//count 欄位都清零
void tasklet_init(struct tasklet_struct *t ,
void (*func)(unsigned long), unsigned long data)
//阻塞當前程序,等待中斷處理函式的執行完畢(yield)
void tasklet_kill(struct tasklet_struct *t)
while (test_bit(tasklet_state_sched, &t->state));
}tasklet_unlock_wait(t);
clear_bit(tasklet_state_sched, &t->state);
}
一些核心模組API 2
核心符號表 就是在核心的內部函式或變數中,可供外部引用的函式和變數的符號表。其實說白了就是乙個索引檔案,它存在的目的就是讓外部軟體可以知道kernel檔案內部實際分配的位置。給乙個記憶體位址address,查詢乙個核心符號,並將該符號的基本資訊,符號名name,偏移offset 大小size,所屬模...
一些核心排程API(2)
根據tcb,獲取對應的記憶體資訊,儲存在專門描述tcb記憶體資訊的 mm struct 中 struct mm struct get task mm struct task struct task task unlock task return mm tcb專門的記憶體資訊儲存區 struct mm...
一些核心同步API 2
獲取訊號量,成功後sem的計數器減1 不成功後程序將進入睡眠狀態而一直等待下去 注意區分down interruptible down killable 由於會使程序進入睡眠狀態 不響應任何訊號量,阻塞 所以不建議使用 void down struct semaphore sem 獲取訊號量,失敗進...