ºìÁªLinuxÃÅ»§
Linux°ïÖú

FreeBSDÖеÄSYSINIT¿ò¼Ü

·¢²¼Ê±¼ä:2007-08-26 20:31:34À´Ô´:ºìÁª×÷Õß:JustForLOVE
SYSINITÊÇÒ»¸öͨÓõĵ÷ÓÃÅÅÐòÓë·Ö±ðÖ´ÐлúÖÆµÄ¿ò¼Ü¡£FreeBSDĿǰʹÓÃËüÀ´½øÐÐÄں˵Ķ¯Ì¬³õʼ»¯¡£SYSINITʹµÃFreeBSDµÄÄں˸÷×Óϵͳ¿ÉÒÔÔÚÄں˻òÄ£¿é¶¯Ì¬¼ÓÔØÁ´½Óʱ±»ÖØÕû¡¢Ìí¼Ó¡¢É¾³ý¡¢Ìæ»»£¬ÕâÑù£¬Äں˺ÍÄ£¿é¼ÓÔØÊ±¾Í²»±ØÈ¥ÐÞ¸ÄÒ»¸ö¾²Ì¬µÄÓÐÐò³õʼ»¯°²ÅűíÉõÖÁÖØÐ±àÒëÄںˡ£Õâ¸öÌåϵҲʹµÃÄÚºËÄ£¿é(ÏÖÔÚ³ÆÎªKLD¿ÉÒÔÓëÄں˲»Í¬Ê±±àÒë¡¢Á´½Ó¡¢ÔÚÒýµ¼ÏµÍ³Ê±¼ÓÔØ£¬ÉõÖÁÔÚϵͳÔËÐÐʱ¼ÓÔØ¡£ÕâЩ²Ù×÷ÊÇͨ¹ý¡°ÄÚºËÁ´½ÓÆ÷¡±(kernel linker)ºÍ¡°Á´½ÓÆ÷¼¯ºÏ¡±(linker set)Íê³ÉµÄ¡£Á´½ÓÆ÷¼¯ºÏ(Linker Set)ÊÇÒ»ÖÖÁ´½Ó·½·¨¡£ÕâÖÖ·½·¨½«Õû¸ö³ÌÐòÔ´ÎļþÖо²Ì¬ÉêÃ÷µÄÊý¾ÝÊÕ¼¯µ½Ò»¸ö¿ÉÁÚ½üѰַµÄÊý¾Ýµ¥ÔªÖС£ SYSINITÒªÒÀ¿¿Á´½ÓÆ÷»ñÈ¡±é²¼Õû¸ö³ÌÐòÔ´´úÂë¶à´¦ÉêÃ÷µÄ¾²Ì¬Êý¾Ý²¢°ÑËüÃÇ×é³ÉÒ»¸ö±Ë´ËÏàÁÚµÄÊý¾Ý¿é¡£ÕâÖÖÁ´½Ó·½·¨±»³ÆÎª¡°Á´½ÓÆ÷¼¯ºÏ¡±(linker set)¡£SYSINITʹÓÃÁ½¸öÁ´½ÓÆ÷¼¯ºÏÒÔά»¤Á½¸öÊý¾Ý¼¯ºÏ£¬°üº¬Ã¿¸öÊý¾ÝÌõÄ¿µÄµ÷ÓÃ˳Ðò¡¢º¯Êý¡¢Ò»¸ö»á±»Ìá½»¸ø¸Ãº¯ÊýµÄÊý¾ÝÖ¸Õë¡£
SYSINIT°´ÕÕÁ½ÀàÓÅÏȼ¶±êʶ¶Ôº¯ÊýÅÅÐòÒÔ±ãÖ´ÐС£µÚÒ»ÀàÓÅÏȼ¶µÄ±êʶÊÇ×ÓϵͳµÄ±êʶ£¬¸ø³öSYSINIT·Ö±ðÖ´ÐÐ×ÓϵͳµÄº¯ÊýµÄÈ«¾Ö˳Ðò£¬¶¨ÒåÔÚÖеÄö¾Ùsysinit_sub_idÄÚ¡£µÚ¶þÀàÓÅÏȼ¶±êʶÔÚ×ÓϵͳÖеÄÔªËØµÄ˳Ðò£¬¶¨ÒåÔÚÖеÄö¾Ùsysinit_elem_orderÄÚ¡£ ÓÐÁ½ÖÖʱ¿ÌÐèҪʹÓÃSYSINIT£ºÏµÍ³Æô¶¯»òÄÚºËÄ£¿é¼ÓÔØÊ±£¬ÏµÍ³Îö¹¹»òÄÚºËÄ£¿éÐ¶ÔØÊ±¡£ÄÚºË×Óϵͳͨ³£ÔÚϵͳÆô¶¯Ê±Ê¹ÓÃSYSINITµÄ¶¨ÒåÏîÒÔ³õʼ»¯Êý¾Ý½á¹¹¡£ÀýÈ磬½ø³Ìµ÷¶È×ÓϵͳʹÓÃÒ»¸öSYSINIT¶¨ÒåÏîÀ´³õʼ»¯ÔËÐжÓÁÐÊý¾Ý½á¹¹¡£É豸Çý¶¯³ÌÐòÓ¦±ÜÃâÖ±½ÓʹÓÃSYSINIT()£¬¶ÔÓÚ×ÜÏ߽ṹÉϵÄÎïÀíÕæÊµÉ豸ӦʹÓÃDRIVER_MODULE()µ÷Óõĺ¯ÊýÏÈÕì²âÉ豸µÄ´æÔÚ£¬Èç¹û´æÔÚ£¬ÔÙ½øÐÐÉ豸µÄ³õʼ»¯¡£Õâһϵͳ¹ý³ÌÖУ¬»á×öһЩרÃÅÕë¶ÔÉ豸µÄÊÂÇ飬Ȼºóµ÷ÓÃSYSINIT()±¾Éí¡£¶ÔÓÚ·Ç×ÜÏ߽ṹһ²¿·ÖµÄÐéÉ豸£¬Ó¦¸ÄÓÃDEV_MODULE()¡£
ʹÓÃSYSINIT
½Ó¿Ú
Í·Îļþ

ºê
SYSINIT(uniquifier, subsystem, order, func, ident)
SYSUNINIT(uniquifier, subsystem, order, func, ident)
Æô¶¯
ºêSYSINIT()ÔÚSYSINITÆô¶¯Êý¾Ý¼¯ºÏÖн¨Á¢Ò»¸öSYSINITÊý¾ÝÏÒÔ±ãSYSINITÔÚϵͳÆô¶¯»òÄ£¿é¼ÓÔØÊ±ÅÅÐò²¢Ö´ÐÐÆäÖеĺ¯Êý¡£SYSINIT()ÓÐÒ»¸ö²ÎÊýuniquifier£¬SYSINITÓÃËüÀ´±êʶÊý¾ÝÏî£¬ËæºóÊÇ×Óϵͳ˳ÐòºÅ¡¢×ÓÏµÍ³ÔªËØË³ÐòºÅ¡¢´ýµ÷Óú¯Êý¡¢´«µÝ¸øº¯ÊýµÄÊý¾Ý¡£ËùÓеĺ¯Êý±ØÐëÓÐÒ»¸öºãÁ¿Ö¸Õë²ÎÊý¡£
SYSINIT()µÄÀý×Ó
#include
void foo_null(void *unused)
{
foo_doo();
}
SYSINIT(foo, SI_SUB_FOO, SI_ORDER_FOO, foo_null, NULL);
struct foo foo_voodoo = {
FOO_VOODOO;
}
void foo_arg(void *vdata)
{
struct foo *foo = (struct foo *)vdata;
foo_data(foo);
}
SYSINIT(bar, SI_SUB_FOO, SI_ORDER_FOO, foo_arg, &foo_voodoo);

×¢Ò⣬SI_SUB_FOOºÍSI_ORDER_FOOÓ¦µ±·Ö±ðÔÚÉÏÃæÌáµ½µÄö¾Ùsysinit_sub_idºÍsysinit_elem_orderÖ®ÖС£¼È¿ÉÒÔʹÓÃÒÑÓеÄö¾ÙÏҲ¿ÉÒÔ½«×Ô¼ºµÄö¾ÙÏîÌí¼Óµ½ÕâÁ½¸öö¾ÙµÄ¶¨ÒåÖ®ÖС£Äã¿ÉÒÔʹÓÃÊýѧ±í´ïʽ΢µ÷SYSINITµÄÖ´ÐÐ˳Ðò¡£ÒÔϵÄÀý×ÓʾÀýÁËÒ»¸öÐèÒª¸ÕºÃÒªÔÚÄں˲ÎÊýµ÷ÕûµÄSYSINIT֮ǰִÐеÄSYSINIT¡£
µ÷ÕûSYSINIT()˳ÐòµÄÀý×Ó
static void
mptable_register(void *dummy __unused)
{
apic_register_enumerator(&mptable_enumerator);
}
SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST,
mptable_register, NULL);
Îö¹¹
ºêSYSUNINIT()µÄÐÐΪÓëSYSINIT()µÄÏ൱£¬Ö»ÊÇËü½«Êý¾ÝÏîÌî¼ÓÖÁSYSINITµÄÎö¹¹Êý¾Ý¼¯ºÏ¡£
SYSUNINIT()µÄÀý×Ó
#include
void foo_cleanup(void *unused)
{
foo_kill();
}
SYSUNINIT(foobar, SI_SUB_FOO, SI_ORDER_FOO, foo_cleanup, NULL);
struct foo_stack foo_stack = {
FOO_STACK_VOODOO;
}
void foo_flush(void *vdata)
{
}
SYSUNINIT(barfoo, SI_SUB_FOO, SI_ORDER_FOO, foo_flush, &foo_stack);
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ