內(nèi)核定時(shí)器可用來(lái)在未來(lái)的某個(gè)時(shí)間點(diǎn)(基于時(shí)鐘滴答)調(diào)度執(zhí)行的某個(gè)函數(shù)蜜暑。
當(dāng)定時(shí)器運(yùn)行時(shí)铐姚,調(diào)度定時(shí)器的進(jìn)程可能正在休眠或在其他處理器上執(zhí)行,或干脆已經(jīng)退出。
定時(shí)器運(yùn)行在軟中斷的上下文中隐绵,也是一種原子上下文之众。
進(jìn)程上下文之外(原子上下文)必須遵守的規(guī)則:
不允許訪問(wèn)用戶空間。因?yàn)闆](méi)有進(jìn)程上下文依许,無(wú)法將任何特定進(jìn)程與用戶空間關(guān)聯(lián)起來(lái)棺禾。
current指針在原子模式下沒(méi)有任何意義,也是不可用的峭跳。因?yàn)橄嚓P(guān)代碼和被中斷的進(jìn)程沒(méi)有任何關(guān)聯(lián)膘婶。
不能執(zhí)行休眠或調(diào)度。原子代碼不可以調(diào)用schedule或者wait_event蛀醉,也不能調(diào)用任何可能引起休眠的函數(shù)悬襟。
內(nèi)核代碼可以調(diào)用in_interrpt()來(lái)判斷自己是否處于中斷上下文。
定時(shí)器API:
#include <linux/timer.h>
struct timer_list{
? ? ? ? ? /* ...*/
? ? ? ? ? unsigned long expires;
? ? ? ? ? void? (*function)(unsigned long);
? ? ? ? ? unsigned long data;
};
void init_timer(struct timer_list *timer);
struct timer_list ?TIMER_INITIALIZE(_function, _expires, _data);
void add_timer(struct timer_list * timer);
int ?del_timer(struct timer_list *timer);