linux tasklet
http://blog.chinaunix.net/u/24474/showart_227121.html
Çý¶¯³ÌÐòʹÓÃtasklet»úÖÆ
ת×Ô£ºhttp://blog.chinaunix.net/u/15169/showart.php?id=82989
Çý
¶¯³ÌÐòÔÚ³õʼ»¯Ê±£¬Í¨¹ýº¯Êýtask_init½¨Á¢Ò»¸ötasklet£¬È»ºóµ÷Óú¯Êýtasklet_schedule½«Õâ¸ötasklet·ÅÔÚ
tasklet_vecÁ´±íµÄÍ·²¿£¬²¢»½ÐѺǫ́Ïß³Ìksoftirqd¡£µ±ºǫ́Ïß³ÌksoftirqdÔËÐе÷ÓÃ__do_softirqʱ£¬»áÖ´ÐÐÔÚÖжÏ
ÏòÁ¿±ísoftirq_vecÀïÖжϺÅTASKLET_SOFTIRQ¶ÔÓ¦µÄtasklet_actionº¯Êý£¬È»ºótasklet_action±éÀú
tasklet_vecÁ´±í£¬µ÷ÓÃÿ¸ötaskletµÄº¯ÊýÍê³ÉÈíÖжϲÙ×÷¡£
ÏÂÃæ¶Ôº¯Êýtasklet_initºÍtasklet_schedule·ÖÎö£º
º¯Êýtasklet_init³õʼ»¯Ò»¸ötasklet,Æä²ÎÊýtÊÇtasklet_struct½á¹¹ÃèÊöµÄtasklet,²ÎÊý(*func)ÊÇÈíÖжÏÏìÓ¦º¯Êý¡£
void tasklet_init(struct tasklet_struct *t,
void (*func)(unsigned long), unsigned long data)
{
t->next = NULL;
t->state = 0;
atomic_set(&t->count, 0);
t->func = func;
t->data = data;
}
Çý¶¯³ÌÐòµ÷Óú¯Êýtasklet_scheduleÀ´ÔËÐÐtasklet¡£
static inline void tasklet_schedule(struct tasklet_struct *t)
{
if (!test_and_set_bit(TASKLET_STATE_SCHED, &t->state))
__tasklet_schedule(t);
}
º¯Êý__tasklet_scheduleµÃµ½µ±Ç°CPUµÄtasklet_vecÁ´±í£¬²¢Ö´ÐÐTASKLET_SOFTIRQÈíÖжϡ£
void fastcall __tasklet_schedule(struct tasklet_struct *t)
{
unsigned long flags;
local_irq_save(flags);
t->next = __get_cpu_var(tasklet_vec).list;
__get_cpu_var(tasklet_vec).list = t;
raise_softirq_irqoff(TASKLET_SOFTIRQ);
local_irq_restore(flags);
}
º¯Êýraise_softirq_irqoffÉèÖÃÈíÖжÏnrΪ¹ÒÆð״̬£¬²¢ÔÚûÓÐÖжÏʱ»½ÐÑÏß³Ìksoftirqd¡£º¯Êýraise_softirq_irqoff±ØÐëÔÚ¹ØÖжÏÇé¿öÏÂÔËÐС£
inline fastcall void raise_softirq_irqoff(unsigned int nr)
{
__raise_softirq_irqoff(nr);
/*
* If we're in an interrupt or softirq, we're done
* (this also catches softirq-disabled code). We will
* actually run the softirq once we return from
* the irq or softirq.
*
*
Ïà¹ØÎĵµ£º
Linux Îļþϵͳ¸ÅÊö
×÷Õߣº±±ÄÏÄϱ±
À´×Ô£ºLinuxSir.Org
ÕªÒª£º ±¾ÎÄͨ¹ýÎļþϵͳµÄ¶¨Òå˵Æð£¬È»ºóͨ¹ýÒýÎļòµ¥µÄ½éÉÜÁËÒ»ÏÂÎļþϵͳÀàÐÍ£»¶ÔLinux³£ÓõÄext2¡¢ext3¼°reiserfs ¸ù¾Ý±¾ÈËʹÓþÑéÒ²·º·ºµÄ̸ÁË̸£¬µ«²¢²»ÊÇרҵµÄ¡£ÈçºÎÔĶÁ±¾ÎÄ£¬»¹ÊÇÓÃÂí¿Ë˼ÀíÂÛ¸æËßÎÒÃǵķ½·¨£ºÒ»·ÖΪ¶þ£¬±ß¿´±ßÅú°É£»Ä¿Â¼Ë÷Òý Ò»¡¢Ê²Ã´ ......
ʹÓùý³ÌÖеÄÐĵãº
Ò»¡¢½â³ýĿ¼ӳÉä¹ØÏµ
umount Ŀ¼¿ÉÒÔ½â³ý¹ØÁª¹ØÏµ
±ØÐëÏÈÔÚ¿Í»§¶Ëumount£¬È»ºóÔÚ·þÎñÆ÷¶ËÍ£Ö¹nfs·þÎñ£¬ÒÔ¼°ÐÞ¸Ä/etc/exports£¬·ñÔòµÄ»°»áµ¼ÖÂdf -hÎÞ·¨¹Ø±Õ
¶þ¡¢mount.nfs: Input/output error
½â¾ö:ÔÚ¿Í»§¶ËÒ²ÐèÆô¶¯portmap
Èý¡¢ÐÞ¸ÄÍê±Ï/etc/exportsÎļþÖ®ºó£¬¿ÉÒÔÖØÆônfs·þÎñ£¬Ò²¿ÉÒÔʹÓÃexp ......
ÎÒÕýÔÚѧϰдlinux device driver for embedded system.
ÎÒÓÐÒ»¸ölinuxǶÈëʽÉ豸£¬Ò²ÓÐÕâ¸öÉ豸µÄlinuxÔ´´úÂë¡£Ò²ÓÐcross compiler tool chain.
µÚÒ»²½£¬¾ÍÊÇдһ¸ö¼òµ¥µÄhelloÄ£¿é£¬È»ºó×°µ½É豸ÖС£ÒÔÑéÖ¤ÎÒÕâ¸ö¿ª·¢»·¾³¡£
ÔÚÍøÉÏËÑË÷ÁËһϣ¬ how to cross compile linux device driver
·¢ÏÖÔÚlinux´úÂë¸ùĿ¼µÄMak ......
ÔÚÄ³Ð©ÌØÊâµÄÇé¿öÏ£¬ÈçÒòÎªÍøÂç»òÕßXÅäÖõĹØÏµÎÞ·¨Á¬½Óµ½X server»òÕßÖ÷»úÉÏûÓÐX£¬¾Í¿ÉÒÔʹÓþ²Ä¬°²×°µÄ·½Ê½°²×°Êý¾Ý¿â£¬Í¬ÑùÈç¹ûÐèÒª´ó¹æÄ£²¿Êð£¬Ôò¾²Ä¬°²×°½«»á´ó´ó¼õÇáDBAµÄÖØ¸´ÀͶ¯Á¦£¬¶øÇÒ¾²Ä¬°²×°²»ÐèÒªX£¬´Ó°²×°Ð§ÂÊ
ÔÚÄ³Ð©ÌØÊâµÄÇé¿öÏ£¬ÈçÒòÎªÍøÂç»òÕßXÅäÖõĹØÏµÎÞ·¨Á¬½Óµ½X server»òÕßÖ÷»úÉÏûÓÐX£ ......
ÔÚVFSµÄÖ§³ÖÏ£¬Óû§Ì¬½ø³Ì¶ÁдÈκÎÀàÐ͵ÄÎļþϵͳ¶¼¿ÉÒÔʹÓÃreadºÍwrite×ÅÁ½¸öϵͳµ÷Ó㬵«ÊÇÔÚlinuxÄÚºËÖÐûÓÐÕâÑùµÄϵͳµ÷ÓÃÎÒÃÇÈçºÎ²Ù×÷ÎļþÄØ£¿ÎÒÃÇÖªµÀreadºÍwriteÔÚ½øÈëÄÚºË̬֮ºó£¬Êµ¼ÊÖ´ÐеÄÊÇsys_readºÍsys_write£¬µ«ÊDz鿴ÄÚºËÔ´´úÂ룬·¢ÏÖÕâЩ²Ù×÷ÎļþµÄº¯Êý¶¼Ã»Óе¼³ö(ʹÓÃEXPORT_SYMBOLµ¼³ö)£¬Ò²¾ÍÊÇ˵ÔÚÄÚºË ......