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

LinuxÄÚºËÇý¶¯³ÌÐò³õʼ»¯Ë³ÐòµÄµ÷Õû

·¢²¼Ê±¼ä:2006-10-13 01:19:06À´Ô´:ºìÁª×÷Õß:Service
½ñÌìÔÚ×öÒ»¸öÇý¶¯µÄʱºòÒªÓõ½ÁíÒ»¸öÇý¶¯£¨I2C£©ÌṩµÄAPI£¬ÔÚÄں˳õʼ»¯Ê±Åöµ½ÁËÒ»¸öÒÀÀµÎÊÌâ¡£
ÎÒµÄÇý¶¯ÔÚI2C³õʼ»¯Ö®Ç°¾ÍÔËÐÐÆðÀ´ÁË£¬¶øÕâʱI2CÌṩµÄAPI»¹´¦ÓÚ²»¿ÉÓÃ״̬¡£²éÁ˺ܶà×ÊÁÏ£¬ÍøÉÏÓÐÈË˵ËùÓÐʹÓÃmodule_initÕâ¸öºêµÄÇý¶¯³ÌÐòµÄÆð¶¯Ë³Ðò¶¼ÊDz»È·¶¨µÄ£¨ÎÒûÓв鵽ȨÍþµÄ×ÊÁÏ£©¡£ºóÀ´ÔÚlinuxforumÉÏ¿´µ½Ò»ÕÅÌû×Óhttp://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=563349&page=&view=&sb=&o=&fpart=1&vc=1£¬ÕâÀïÃæ½²ÁËÒ»ÏÂÕâ¸öÎÊÌ⣺

ËùÓеÄ__initº¯ÊýÔÚÇø¶Î.initcall.initÖл¹±£´æÁËÒ»·Ýº¯ÊýÖ¸Õ룬
ÔÚ³õʼ»¯Ê±Äں˻áͨ¹ýÕâЩº¯ÊýÖ¸Õëµ÷ÓÃÕâЩ__initº¯ÊýÖ¸Õ룬
²¢ÔÚÕû¸ö³õʼ»¯Íê³Éºó£¬ÊÍ·ÅÕû¸öinitÇø¶Î£¨°üÀ¨.init.text£¬.initcall.initµÈ£©£¬

×¢Ò⣬ÕâЩº¯ÊýÔÚÄں˳õʼ»¯¹ý³ÌÖеĵ÷ÓÃ˳ÐòÖ»ºÍÕâÀïµÄº¯ÊýÖ¸ÕëµÄ˳ÐòÓйأ¬
ºÍ1£©ÖÐËùÊöµÄÕâЩº¯Êý±¾ÉíÔÚ.init.textÇø¶ÎÖеÄ˳ÐòÎ޹ء£

ÔÚ2.4ÄÚºËÖУ¬ÕâЩº¯ÊýÖ¸ÕëµÄ˳ÐòÒ²ÊǺÍÁ´½ÓµÄ˳ÐòÓйصģ¬ÊDz»È·¶¨µÄ¡£

ÔÚ2.6ÄÚºËÖУ¬initcall.initÇø¶ÎÓÖ·Ö³É7¸ö×ÓÇø¶Î£¬·Ö±ðÊÇ
.initcall1.init
.initcall2.init
.initcall3.init
.initcall4.init
.initcall5.init
.initcall6.init
.initcall7.init

µ±ÐèÒª°Ñº¯Êýfn·Åµ½.initcall1.initÇø¶Îʱ£¬Ö»ÒªÉùÃ÷
core_initcall(fn);
¼´¿É¡£

ÆäËûµÄ¸÷¸öÇø¶ÎµÄ¶¨Òå·½·¨·Ö±ðÊÇ£º
core_initcall(fn) --->.initcall1.init
postcore_initcall(fn) --->.initcall2.init
arch_initcall(fn) --->.initcall3.init
subsys_initcall(fn) --->.initcall4.init
fs_initcall(fn) --->.initcall5.init
device_initcall(fn) --->.initcall6.init
late_initcall(fn) --->.initcall7.init

¶øÓë2.4¼æÈݵÄinitcall(fn)ÔòµÈ¼ÛÓÚdevice_initcall(fn)¡£

¸÷¸ö×ÓÇø¶ÎÖ®¼äµÄ˳ÐòÊÇÈ·¶¨µÄ£¬¼´Ïȵ÷ÓÃ.initcall1.initÖеĺ¯ÊýÖ¸Õë
ÔÙµ÷ÓÃ.initcall2.initÖеĺ¯ÊýÖ¸Õ룬µÈµÈ¡£
¶øÔÚÿ¸ö×ÓÇø¶ÎÖеĺ¯ÊýÖ¸ÕëµÄ˳ÐòÊǺÍÁ´½Ó˳ÐòÏà¹ØµÄ£¬ÊDz»È·¶¨µÄ¡£

ÔÚÄÚºËÖУ¬²»Í¬µÄinitº¯Êý±»·ÅÔÚ²»Í¬µÄ×ÓÇø¶ÎÖУ¬Òò´ËÒ²¾Í¾ö¶¨ÁËËüÃǵĵ÷ÓÃ˳Ðò¡£
ÕâÑùÒ²¾Í½â¾öÁËһЩinitº¯ÊýÖ®¼ä±ØÐë±£Ö¤Ò»¶¨µÄµ÷ÓÃ˳ÐòµÄÎÊÌâ¡£

°´ÕÕinclude/linux/init.hÎļþËùдµÄ£¬ÎÒÔÚÇý¶¯Àï³¥ÊÔÁËÕâÑùÁ½ÖÖ·½Ê½£º
__define_initcall("7", fn);
late_initcall(fn);
¶¼¿ÉÒÔ°ÑÎÒµÄÇý¶¯µ÷Õûµ½×îºóµ÷Óá£Êµ¼ÊÉÏÉÏÃæÁ½¸öÊÇÒ»»ØÊ£º
#define late_initcall(fn) __define_initcall("7", fn)
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 0 ÌõÆÀÂÛ