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

Ïê½âLinux²Ù×÷ϵͳÉ豸Çý¶¯¼æÈÝÐÔ

·¢²¼Ê±¼ä:2006-10-12 11:17:27À´Ô´:ºìÁª×÷Õß:Redassociation
¡¡¡¡×îнøÕ¹

¡¡¡¡LinuxÒ»Ö±ÔÚѸËٵط¢Õ¹×Å£¬¿ª·¢ÈËÔ±×ÜÊÇÆÈÇÐÏ£Íû¸ÄÉƺËÐÄÄÚ²¿£¬ËüÃDz¢²»¿¼ÂÇÏòºó¼æÈÝÐÔ¡£ÕâÖÖ×ÔÓÉ¿ª·¢µ¼ÖÂÁ˲»Í¬°æ±¾ºËÐÄÌṩµÄÉ豸Çý¶¯³ÌÐò½Ó¿ÚÖ®¼äÒ»¶¨³Ì¶ÈµÄ²»¼æÈÝ¡£²»¹ý£¬ÔÚÓ¦Óü¶»¹±£³Ö׿æÈÝ£¬³ýÁ˸ö±ðÐèÒªÓëºËÐÄÌØÕ÷½øÐеͼ¶½»»¥µÄÓ¦Óã¨Ïóps£©¡£

¡¡¡¡ÁíÒ»·½Ã棬É豸Çý¶¯³ÌÐòÊÇÖ±½ÓÁ´½Óµ½ºËÐÄÓ³ÏóÉϵģ¬Òò´Ë±ØÐëÓëÊý¾Ý½á¹¹¡¢È«¾Ö±äÁ¿¡¢ÒÔ¼°ÓÉÄÚϵͳÒý³öµÄº¯Êý·¢ÉúµÄ¸Ä±ä±£³ÖÒ»Ö¡£ÔÚ¿ª·¢¹ý³ÌÖУ¬Ëæ×ÅÐÂÌØÕ÷µÄ¼ÓÈ룬ÄÚ²¿±»Ð޸ģ»ÐµÄʵÏÖÈ¡´úÁ˾͵ÄʵÏÖ£¬ÒòΪʵ¼ùÖ¤Ã÷ËüÃǸü¿ì£¬¸üÇåÎú¡£¾¡¹Ü²»¼æÈÝÐÔÒªÇó³ÌÐòÔ±ÔÚдģ¿éʱҪ×öһЩ¶îÍâµÄ¹¤×÷£¬ÎÒÈÏΪÁ¬ÐøµÄ¿ª·¢ÊÇLinuxÉçÇøµÄ³É¹¦µã£ºÑϸñµÄÏȺó¼æÈÝÐÔ×îÖÕÖ¤Ã÷ÊÇÓк¦µÄ¡£

¡¡¡¡ÕâÒ»Õ½²Êö2.0.xºÍ2.1.43Ö®¼äµÄ²»Í¬£¬ÕâЩ½«»áÓë¼´½«ÍƳöµÄ2.2·¢²¼ÀàËÆ¡£LinusÔÚÇ°¼¸¸ö2.1°æ±¾ÖÐÒýÈëÁË×îÖØÒªµÄ¸Ä±ä£¬ÕâÑùºËÐľͿÉÒԶྭÀú¼¸¸ö2.1°æ±¾£¬Ê¹µÃÇý¶¯³ÌÐòµÄ×÷ÕßÓÐ×ã¹»µÄʱ¼äÔÚ¿ª·¢±»Ëø¶¨ÒÔ·¢²¼Îȶ¨µÄ2.2֮ǰÀ´Îȶ¨Çý¶¯³ÌÐò¡£ÏÂÃæµÄС½Ú½éÉÜÇý¶¯³ÌÐòÊÇÈçºÎ´¦Àí2.0ºÍ2.1.43Ö®¼äµÄ²»Í¬µÄ¡£ÎÒÒѾ­ÐÞ¸ÄÁ˱¾Êé½éÉܵÄËùÓÐʾÀý´úÂ룬ʹµÃËüÃÇ¿ÉÒÔͬʱÔÚ2.0ºÍ2.1.43ÉϱàÒëºÍÔËÐУ¬ÒÔ¼°ÕâÖ®¼äµÄ´ó¶àÊý°æ±¾¡£Çý¶¯³ÌÐòµÄа汾¿ÉÒÔ´ÓO¡¯ReillyµÄFTPÕ¾µãÉÏÔÚÏßÀý×ÓµÄv2.1Ŀ¼Ïµõ½¡£2.0ºÍ2.1Ö®¼äµÄ¼æÈÝÐÔͨ¹ýÍ·Îļþsysdep-2.1.h»ñµÃ£¬Ëü¿ÉÒÔÓëÄã×Ô¼ºµÄÄ£¿é¼¯³É¡£ÎÒÑ¡Ôñ²»°Ñ¼æÈÝÐÔÀ©Õ¹µ½1.2±ÜÃâÁ˸øC´úÂë¼ÓÔØÌ«¶àµÄÌõ¼þ£¬¶øÇÒ1.2-2.0µÄ²»Í¬ÒѾ­ÔÚÇ°ÃæµÄÕ½ڽâÊ͹ýÁË¡£ÔÚÎÒ½«ÒªÐ´ÍêÕâ±¾Êéʱ£¬ÎÒÁ˽⵽´Ó2.1.43ÆðÓÖÒýÈëÁËһЩСµÄ²»¼æÈÝÐÔ£»ÎÒ²»´òËã¶ÔÖ®¼ÓÒÔÆÀÊö£¬ÒòΪÎÒ²»Äܱ£Ö¤¶ÔÕâЩ×îа汾µÄÍêÈ«Ö§³Ö¡£

¡¡¡¡×¢ÒâÔÚ±¾ÕÂÎÒ²»»á½²Êö2.1¿ª·¢ÏµÁÐÒýÈëµÄËùÓÐж«Î÷¡£ÎÒÒª×öµÄÖ»ÊÇÒÆÖ²2.0Ä£¿é£¬Ê¹Ö®¿ÉÒÔÔÚ2.0ºÍ2.1ºËÐÄÉÏÔËÐС£ÀûÓÃ2.1µÄÌØÕ÷Òâζ×Å·ÅÆú¶Ô²»¾ßÓÐÕâЩÌØÕ÷µÄ2.0·¢²¼µÄÖ§³Ö¡£2.0°æ±¾ÈÔÊDZ¾ÊéµÄÖص㡣ÔÚдsysdep-2.1.hʱ£¬ÎÒÒÑŬÁ¦Ê¹ÄãÊìϤеÄAPI£¬ÎÒÒýÈëµÄºêÓÃÀ´Ê¹2.1µÄ´úÂë¿ÉÒÔÔÚ2.0ÉÏÅÜ£¬¶ø²»ÊÇÏà·´¡£

¡¡¡¡±¾ÕÂÒÔÖØÒªÐÔÖð½¥½µµÍµÄ˳Ðò½éÉܲ»¼æÈÝÐÔ£»×îÖØÒªµÄ²»Í¬Ê×Ïȱ»½éÉÜ£¬´ÎÒªµÄϸ½ÚÔòÔÚºóÃæ½éÉÜ¡£

¡¡¡¡Ä£¿é»¯

¡¡¡¡ÔÚLinuxÉçÇøÖУ¬Ä£¿é»¯±äµÄÔ½À´Ô½ÖØÒª£¬¿ª·¢ÈËÔ±¾ö¶¨ÓÃÒ»¸ö¸üÇåÎúµÄʵÏÖÈ¡´ú¾ÉµÄ¡£Í·ÎļþÔÚ2.1.18ÖÐÍêÈ«ÖØдÁË£¬Ò»¸öеÄAPI±»ÒýÈë¡£ÈçÄãËùÆÚÍûµÄ£¬ÐµÄʵÏֱȾɵÄÒªÈÝÒ×ʹÓá£ÎªÁ˼ÓÔØÄãµÄÄ£¿é£¬Ä㽫ÐèÒª°ümodutils-2.1.34ÉõÖÁ¸üа汾£¨Ï¸½Ú¼ûDocumentation/

¡¡¡¡Changes£©¡£µ±Óë¾ÉµÄºËÐÄÒ»ÆðʹÓÃʱ£¬Õâ¸ö°ü¿ÉÒԻص½¼æÈÝģʽ£¬Òò´ËÄã¿ÉÒÔÓÃÕâ¸öаüÌæ»»modules-2.0.0£¬¼´Ê¹Äã¾­³£ÔÚ2.0ºÍ2.1Ö®¼äÇл»¡£

¡¡¡¡Òý³ö·ûºÅ

¡¡¡¡·ûºÅ±íµÄнӿڱÈÒÔÇ°µÄÒªÈÝÒ׶àÁË£¬ËüÒÀÀµÓÚÏÂÃæµÄºê£º

¡¡¡¡EXPORT_NO_SYMBOLS£»Õâ¸öºêÓëregister_symtab(NULL)µÈ¼Û£»Ëü¿ÉÒÔ³öÏÖÔÚÒ»¸öº¯ÊýµÄÄÚ²¿»òÍⲿ£¬ÒòΪËüÖ»ÊÇÖ¸µ¼»ã±àÆ÷£¬¶ø²»²úÉúʵ¼Ê´úÂë¡£Èç¹ûÄãÏëÔÚLinux2.0ÉϱàÒëÄ£¿é£¬Õâ¸öºêÓ¦¸ÃÔÚinit_moduleÖб»Ê¹Óá£

¡¡¡¡EXPORT_SYMTAB£»Èç¹ûÄã´òËãÒý³öһЩ·ûºÅ£¬ÄÇôģ¿é±ØÐëÔÚ°üº¬Ö®Ç°¶¨ÒåÕâ¸öºê¡£

¡¡¡¡EXPORT_SYMBOL(name)£»Õâ¸öºê±íÃ÷ÄãÏëÒý³öÕâ¸ö·ûºÅÃû¡£Ëü±ØÐëÔÚÈκκ¯ÊýÖ®ÍâʹÓá£

¡¡¡¡EXPORT_SYMBOL_NOVERS(name)ʹÓÃÕâ¸öºê¶ø²»ÊÇEXPORT_SYMBOL()Ç¿ÖƶªÆú°æ±¾ÐÅÏ¢£¬¼´Ê¹ÊDZàÒë´øÓа汾֧³ÖµÄ´úÂë¡£Õâ¶Ô±ÜÃâһЩ²»±ØÒªµÄÖرàÒëºÜÓÐÓá£ÀýÈ磬memsetº¯Êý½«×ÜÒÔͬÑùµÄ·½Ê½¹¤×÷£»Òý³ö·ûºÅ¶ø²»´ø°æ±¾ÐÅÏ¢ÔÊÐí¿ª·¢Õ߸ıäʵÏÖ£¨ÉõÖÁʹÓõÄÊý¾ÝÀàÐÍ£©¶ø²»Ðèinsmod±ê³ö²»¼æÈÝÐÔ¡£ÔÚÄ£¿é»¯µÄ´úÂëÖв»´ó¿ÉÄÜÐèÒªÕâ¸öºê¡£

¡¡¡¡Èç¹ûÕâЩºê¶¼Ã»ÓÐÔÚÄãµÄÔ´ÂëÖÐʹÓã¬ÄÇôËùÓеķǾ²Ì¬·ûºÅ¶¼±»Òý³ö£»ÕâÓëÔÚ2.0ÖÐÒ»Èç¹ûÕâЩºê¶¼Ã»ÓÐÔÚÄãµÄÔ´ÂëÖÐʹÓã¬ÄÇôËùÓеķǾ²Ì¬·ûºÅ¶¼±»Òý³ö£»ÕâÓëÔÚ2.0ÖÐÒ»Ñù¡£Èç¹ûÕâ¸öÄ£¿éÊÇ´Ó¼¸¸öÔ´ÎļþÉú³ÉµÄ£¬Äã¿ÉÒÔ´ÓÈκÎÔ´ÎļþÒý³ö·ûºÅ£¬¶øÇÒ»¹¿ÉÒÔÔÚÄ£¿éµÄ·¶Î§Öй²ÏíÈκηûºÅ¡£ÈçÄãËù¿´µ½µÄ£¬Òý³ö·ûºÅ±íµÄз½·¨½â¾öÁËһЩÎÊÌ⣬µ«Õâ¸ö´´ÐÂÒ²ÒýÈëÁËÒ»¸öÖØÒªµÄ²»¼æÈÝÐÔ£ºÒ»¸öÒý³öÁËһЩ·ûºÅµÄÄ£¿é£¬Èç¹ûÏëͬʱÔÚ2.0ºÍ2.1ÉϱàÒëÔËÐУ¬Ôò±ØÐëÓÃÌõ¼þ±àÒëÀ´°üº¬Á½¸öʵÏÖ¡£ÏÂÃæÊÇexportÄ£¿é£¨v2.1/misc-modules/export.c£©ÈçºÎ´¦ÀíÕâ¸öÎÊÌâµÄµ±Ê¹ÓÃ2.1.18»ò¸üеĺËÐÄʱ£¬REGISTER_SYMTABÀ©Õ¹ÎªÊ²Ã´¶¼²»×ö£¬ÒòΪinit_moduleÖÐûÓÐʲôÐèÒª×öµÄ£»ÔÚº¯ÊýÍâʹÓÃEXPORT_SYMBOLÊÇÒý³öÄ£¿é·ûºÅΨһÐèÒª×öµÄ¡£

¡¡¡¡ÉùÃ÷²ÎÊý
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 8 ÌõÆÀÂÛ

  1. Redassociation ÓÚ 2006-10-12 11:25:28·¢±í:

    ¡¡¡¡ÆäËü¸Ä±ä

    ¡¡¡¡ÔÚ2.0ºÍ2.1.43Ö®¼ä»¹ÓÐÆäËüһЩ²»Í¬¡£ÒÔÎҵĹ۵㣬ËüÃDz»ÐèÒª¸øÓèÌرðµÄ¹Ø×¢£¬Òò´ËÎÒ½«Ñ¸ËٵظÅÊöһϡ£proc_register_dynamicÔÚ2.1.29ÖÐÏûʧÁË¡£×î½üµÄºËÐĶÔÿ¸ö/procÎļþʹÓÃproc_register½Ó¿Ú£»Èç¹û½á¹¹proc_dir_entryµÄlow_inoÓòÊÇ0£¬ÄÇô»á±»·ÖÅäÒ»¸ö¶¯Ì¬µÄinodeºÅ¡£µ±Îª2.1.29»ò¸üеĺËÐıàÒëʱ£¬Í·Îļþsysdep-2.1.hÏóproc_registerÒ»Ñù¶¨Òåproc_register_dynamic£»Õâ¸öÔÚ×¢²áµÄproc_dir_entry½á¹¹ÒÔ0ΪinodeºÅʱÊÇ¿ÉÐеġ£ÔÚÍøÂç½Ó¿ÚÇý¶¯³ÌÐòÁìÓò£¬rebuild_headerÉ豸·½·¨´Ó2.1.15ÆðÓÐÒ»¸öеÄÔ­ÐÍ¡£Èç¹ûÄãÖ»¿ª·¢ÒÔÌ«ÍøÇý¶¯³ÌÐò£¬Äã²»»á¹ØÐÄÕâ¸ö²»Í¬£¬ÒòΪÒÔÌ«ÍøÇý¶¯³ÌÐò²»ÊµÏÖËüÃÇ×Ô¼ºµÄ·½·¨£»ËüÃÇÒÀÀµÓÚͨÓõÄÒÔÌ«ÍøʵÏÖ¡£µ±¾ÉµÄʵÏÖÐèҪʱ£¬Í·Îļþsysdep-2.1¶¨ÒåÁ˺ê__USE_OLD_REBUILD_HEADER__¡£Ê¾ÀýÄ£¿ésnullÏÔʾÁËÈçºÎʹÓÃÕâ¸öºê£¬µ«Ã¿±ØÒªÔÚÕâÀï¸ø³ö¡£

    ¡¡¡¡ÍøÂç´úÂëµÄÁíÒ»¸ö¸Ä±äÓ°ÏìÁ˽ṹenet_statistics£¬Ëü´Ó2.1.25Æð²»ÔÙ´æÔÚ¡£´úÌæËüµÄÊÇÒ»¸öнṹnet_device_stats£¬ËüÔÚÖж¨Ò壬¶ø²»ÊÇ¡£Ð½ṹÓë¾É½á¹¹ÀàËÆ£¬µ«ÊǶàÁËÁ½¸öÓò´æ´¢×Ö½Ú¼ÆÊýÆ÷£ºunsigned longrx_bytes, tx_bytes£»Ò»¸öÈ«ÌØÕ÷µÄÍøÂç½Ó¿ÚÇý¶¯³ÌÐòÓ¦¸ÃÓërx_packetsºÍtx_packetsÒ»µÀÔö¼ÓÕâЩ¼ÆÊýÆ÷£¬¾¡¹ÜÒ»¸ö¿ìËٵļƻ®¿ÉÄÜÒªÅ×ÆúÕâЩ¼ÆÊýÆ÷¡£ºËÐÄÍ·Îļþ½«enet_statistics£¨ÀϽṹµÄÃû×Ö£©¶¨ÒåΪnet_device_stats£¨Ð½ṹµÄÃû×Ö£©ÒÔ·½±ãÒÑÓÐÇý¶¯³ÌÐòµÄ¿ÉÒÆÖ²ÐÔ¡£

    ¡¡¡¡×îºó£¬ÎÒÐèÒªÖ¸³öcurrent²»ÔÙÊǸöÈ«¾Ö±äÁ¿x86, Alpha,ÒÔ¼°SparcµÄºËÐÄÒÆֲʹÓÃÁË´ÏÃ÷µÄ¼¼Çɽ«current´æÔÚ´¦ÀíÆ÷ÖС£ÕâÑùºËÐĵĿª·¢ÕßŬÁ¦ÓÖ¼·³öÁ˼¸¸öCPUÖÜÆÚ¡£Õâ¸ö¼¼ÇɱÜÃâÁË´óÁ¿µÄÄÚ´æ·ÃÎÊ£¬ÓÐʱ»¹ÄÜÊÍ·ÅÒ»¸öͨÓÃÄ¿µÄ¼Ä´æÆ÷£»±àÒëÆ÷¾­³£·ÖÅä´¦ÀíÆ÷¼Ä´æÆ÷À´¸ßËÙ»º´æ¼¸¸ö¾­³£·ÃÎʵÄÄÚ´æλÖ㬶øcurrentÊǾ­³£·ÃÎʵġ£ÔÚ²»Í¬µÄÒÆÖ²ÖÐʹÓÃÁ˲»Í¬µÄ¼¼ÇÉÒÔÓÅ»¯·ÃÎÊ¡£AlphaºÍSparc°æ±¾Ê¹ÓÃÒ»¸ö´¦ÀíÆ÷¼Ä´æÆ÷£¨±àÒëÆ÷ÓÅ»¯²»Ê¹ÓõÄÒ»¸ö£©À´´æ´¢current¡£¶øIntel´¦ÀíÆ÷ÓÐÓÐÏÞÊýÄ¿µÄ¼Ä´æÆ÷£¬±àÒëÆ÷¿ÉÒÔʹÓÃËüÃÇËùÓУ»ÔÚÕâÖÖÇé¿öϼ¼ÇÉ°üÀ¨½«½á¹¹task_structºÍºËÐÄÕ»Ò³´æ´¢ÔÚÁ¬ÐøµÄÐé´æÒ³ÄÚ¡£ÕâÔÊÐícurrentÖ¸Õë±»¡°±àÂ롱ÔÚÕ»Ö¸ÕëÖС£¶Ôÿ¸öLinuxÖ§³ÖµÄƽ̨£¬Í·Îļþcurrent.h>¸ø³öÁËʵ¼ÊÑ¡ÔñµÄʵÏÖ¡£ÏóËùÓÐÖØÒªµÄÈí¼þÒ»Ñù£¬LinuxÒ»Ö±Ôڸıä×Å¡£Èç¹ûÄãÏëΪÕâ¸ö×îеġ¢×îΰ´óµÄºËÐÄдÇý¶¯³ÌÐò£¬ÄãÐèÒª±£³Ö¸úÉϺËÐĵķ¢Õ¹¡£¾¡¹Ü´¦Àí²»¼æÈÝÐÔ¿´ÆðÀ´¿ÉÄܺÜÀ§ÄÑ£¬ÎÒÃÇ·¢ÏÖÁ½µãÌØÐÔ£ºÊ×ÏÈ£¬Ö÷ÒªµÄ³ÌÐòÉè¼Æ¼¼ÇÉÒ»Ö±ÔÚÄÇÀ²»Ì«¿ÉÄܸı䣨ÖÁÉÙ²»³££©£»µÚ¶þ£¬Ã¿´Î¸Ä±ä¶¼±äµÃ¸üºÃÁË£¬¾­³£Ê¹ÄãÔÚ½«À´µÄ¿ª·¢ÖÐÐèÒªµÄ¹¤×÷Ô½À´Ô½ÉÙ¡£

  2. Redassociation ÓÚ 2006-10-12 11:24:56·¢±í:

    ¡¡¡¡ÐéÄâÄÚ´æ

    ¡¡¡¡ÔÚºËÐĵİ汾2.1£¬LinuxµÄIntelÒÆÖ²¶ÔÐéÄâÄÚ´æÓÐÁËÒ»¸ö³ÉÊìµÄÊÓͼ¡£ÔçЩµÄ°æ±¾µÄÄÚ´æ¹ÜÀíһֱʹÓ᰷ֶΡ±µÄ·½·¨£¬ÕâÊÇ´ÓºËÐÄÉúÃüÆڵĿªÊ¼Ê±Æڼ̳ÐÏÂÀ´µÄ¡£Õâ¸ö¸Ä±ä²¢²»Ó°ÏìÇý¶¯³ÌÐò´úÂ룬µ«²»¹ÜÔõÑù£¬»¹ÊÇÖµµÃһ˵µÄ¡£ÐµĹæÔòÓëLinuxµÄÆäËüÒÆֲƥÅäµÄÆðÀ´¡£ÐéÄâµØÖ·¿Õ¼ä±»¹¹Ôì³ÉºËÐľÓÓڷdz£¸ßµÄµØÖ·£¨´Ó3GBÍùÉÏ£©£¬¶øÓû§µØÖ·¿Õ¼äÔÚ0-3GB·¶Î§¡£µ±Ò»¸ö½ø³ÌÔËÐÐÔÚ¡°¹Ü̬¡±Ê±£¬Ëü¿ÉÒÔ·ÃÎÊÁ½¸ö¿Õ¼ä¡£ÁíÒ»·½Ã棬µ±ËüÔËÐÐÔÚ¡°Óû§Ì¬¡±Ê±£¬Ëü²»ÄÜ·ÃÎʺËÐĿռ䣬ÒòΪÊôÓÚºËÐĵÄÒ³±»±ê¼ÇΪ¡°¹ÜÀíÔ±¡±Ò³£¬´¦ÀíÆ÷×èÖ¹Á˶ÔËüÃǵķÃÎÊ¡£

    ¡¡¡¡ÕâÖÖÄÚ´æ²¼¾ÖÓÐÖúÓÚÈ¡Ïû¾ÉµÄmemcpy_to_fsÒ»ÀàµÄº¯Êý£¬ÒòΪÒѾ­Ã»ÓÐFS¶ÎÁË¡£ºËÐÄ¿Õ¼äºÍÓû§¿Õ¼äʹÓÃͬһ¸ö¡°¶Î¡±£¬ÆäÇø±ðÔÚÓÚCPUËùÔÚµÄÓÅÏȼ¶¡£

    ¡¡¡¡´¦ÀíºËÐÄ¿Õ¼ä´íÎó

    ¡¡¡¡LinuxºËÐĵÄ2.1°æ±¾¶Ô´ÓºËÐĿռ䴦Àí¶Î´íÎóµÄÄÜÁ¦ÓÐÒ»¸ö¼«´óµÄÔöÇ¿¡£±¾ÕÂÀÎÒ×¼±¸¶ÔÆäÔ­Ôò¸øÒ»¸ö¿ìËٵĸÅÊö¡£Ð»úÖƶÔÔ´ÂëµÄÓ°ÏìÔÚ¡°·ÃÎÊÓû§¿Õ¼ä¡±ÖÐÒѾ­ÃèÊö¹ý¡£

    ¡¡¡¡ÈçÇ°ÃæËùÌáµ½¹ýµÄ£¬ºËÐĵÄ×î½ü°æ±¾³ä·ÖÀûÓÃÁËELF¶þ½øÖƸñʽ£¬ÌرðÊÇ¿¼Âǵ½ËüµÄÔÚ±àÒëµÄÎļþÖж¨ÒåÓû§¶¨ÒåµÄ½ÚµÄÄÜÁ¦¡£±àÒëÆ÷ºÍÁ´½ÓÆ÷±£Ö¤ÊôÓÚͬһ½ÚµÄ´úÂë¶ÎÔÚ¿ÉÖ´ÐÐÎļþÖÐÒ»¶¨ÊÇÁ¬ÐøµÄ£¬Òò´Ëµ±Îļþ±»×°ÔØʱ£¬ÔÚÄÚ´æÖÐÒ²ÊÇÁ¬ÐøµÄ¡£ÀýÍâ´¦ÀíÊÇͨ¹ýÔÚºËÐÄ¿ÉÖ´ÐÐÓ³Ïó(vmlinux)Öж¨ÒåÁ½¸öнÚʵÏֵġ£Ã¿´Îµ±Ô´Âëͨ¹ýcopy_to_user, put_user, »òÆä¶ÁÈ¡µÄ¶ÔÓ¦Õß·ÃÎÊÓû§¿Õ¼äʱ£¬Ò»Ð©´úÂë±»¼Óµ½ÕâÁ½¸ö½ÚÖС£¾¡¹ÜÕâ¿´ÆðÀ´ÊDz»¿ÉºöÂԵĿªÏú£¬Õâ¸öлúÖƵÄÒ»¸ö½á¹ûÊDz»ÔÙÐèҪʹÓÃÒ»¸ö°º¹óµÄverify_area¡£¶øÇÒ£¬Èç¹ûʹÓõÄÓû§µØÖ·ÊÇÕýÈ·µÄ£¬¼ÆËãÁ÷½«²»»áÓÐÒ»¸öÌøת¡£µ±±»·ÃÎʵÄÓû§µØÖ·ÊÇÎÞЧµÄʱ£¬Ó²¼þ·¢³öÒ»¸öÒ³Ãæ´í¡£´íÎó´¦Àí³ÌÐò£¨ÔÚÌåϵ½á¹¹Ìض¨µÄÔ´ÂëÊ÷ÖеÄdo_page_fault£©È·ÈÏÕâ¸ö´íÎóÊÇÒ»¸ö¡°²»ÕýÈ·µÄµØÖ·¡±´í£¨Óë¡°Ò³²»´æÔÚ¡±Ïà¶Ô£©£¬²¢Ê¹ÓÃÏÂÃæµÄELF½Ú½øÐÐÊʵ±µÄ¶¯×÷£º__ex_tableÕâ½ÚÊǸöÖ¸Õë¶ÔµÄ±í¡£Ã¿¶ÔµÄµÚÒ»¸öÖ¸ÕëÖ¸ÏòÒ»¸ö¿ÉÄÜÒò´íÎóµÄÓû§¿Õ¼äµØÖ·¶øʧ°ÜµÄÖ¸ÁµÚ¶þ¸öÖµÖ¸ÏòÒ»¸öµØÖ·£¬´¦ÀíÆ÷½«ÔÚÄÇÀïÕÒµ½¼¸ÌõµÄÖ¸ÁîÀ´´¦ÀíÕâ¸ö´íÎó¡£..fixupÕâ½Ú°üº¬Ö¸Á´¦ÀíÔÚ__ex_tableÖÐÃèÊöµÄËùÓпÉÄܵĴíÎó¡£Õâ¸ö±íÖÐÿ¶ÔµÄµÚ¶þ¸öÖ¸ÕëÖ¸Ïò¾ÓÓÚ.fixupÖеĴúÂë¡£

    ¡¡¡¡Í·Îļþ¸ºÔð¹¹ÔìËùÐèµÄELF½Ú¡£·ÃÎÊÓû§¿Õ¼äµÄÿ¸öº¯Êý£¨Èçput_user£©À©Õ¹Îª»ã±àÖ¸ÁËü½«Ö¸Õë¼Óµ½__ex_table²¢´¦Àí.fixupÖÐµÄ´í¡£µ±´úÂëÔËÐÐʱ£¬Êµ¼ÊµÄÖ´Ðз¾¶ÓÐһϲ½Öè×é³É£ºÓÃÓÚº¯Êý¡°·µ»ØÖµ¡±µÄ´¦ÀíÆ÷¼Ä´æÆ÷±»³õʼ»¯Îª0£¨Ò²¾ÍÊÇûÓдíÎ󣩣¬Êý¾Ý±»´«ËÍ£¬·µ»ØÖª±»´«»Øµ÷ÓÃÕß¡£Ò»°ãµÄ²Ù×÷µÄÈ··Ç³£¿ì¡£Èç¹ûÒ»¸öÒì³£·¢Éú£¬do_page_fault´òÓ¡Ò»ÌõÏûÏ¢£¬²é¿´__ex_table£¬Ìøתµ½.fixup£¬ÕâÀïÉèÖ÷µ»ØֵΪ-EFAULT£¬È»ºóÌøתµ½·ÃÎÊÓû§¿Õ¼äµÄÖ¸ÁîºóλÖá£

    ¡¡¡¡ÐµÄÐÐΪ¿ÉÒÔÓÃfaulty£¨ÔÚv2.1/misc-modulesĿ¼£©Ä£¿éÀ´¼ìÑé¡£faultyÔÚµÚËÄÕ¡°µ÷ÊÔ¼¼ÇÉ¡±ÖС°µ÷ÊÔϵͳ´íÎó¡±Ò»½ÚÃèÊö¡£faultyµÄÉ豸½áµãͨ¹ý¶ÁÈ¡Ò»¸ö¶Ì»º³åÇø½çÍâÀ´´«ËÍÊý¾Ýµ½Óû§¿Õ¼ä£¬ÕâÑùµ±¶ÁÈ¡Ò»¸öÔÚÄ£¿éÒ³ÒÔÉϵĵØַʱ£¬»áµ¼ÖÂÒ»¸öÒ³Ãæ´í¡£ÓÐȤµÄÊÇ×¢Òâµ½Õâ¸ö´íÎóÒÀÀµÓÚʹÓúËÐÄ¿Õ¼äÖеÄÒ»¸ö²»ÕýÈ·µØÖ·£¬¶ø´ó¶àÊýÇé¿öÏÂÒì³£ÊÇÓгö´íµÄÓû§¿Õ¼äµØÖ·Ôì³ÉµÄ¡£µ±ÔÚPCÉÏÓÃcatÃüÁî¶Áfaultyʱ£¬ÏÂÃæµÄÏûÏ¢±»´òÓ¡ÔÚ¿ØÖÆ̨ÉÏ£º

    [code]¡¡¡¡read: inode c1188348, file c16decf0, buf 0804cbd0, count 4096
    cat: Exception at [](c2807115)[/code]

    ¡¡¡¡Ç°Ò»ÐÐÊÇÓÉfaultyµÄread·½·¨´òÓ¡µÄ£¬¶øºóÕßÊÇÓÉ´íÎó´¦Àí³ÌÐò´òÓ¡µÄ¡£µÚÒ»¸öÊý×ÖÊÇ´íÎóÖ¸ÁîµÄµØÖ·£¬¶øµÚ¶þ¸öÊÇÐÞÕý´úÂ루ÔÚ.fixup½ÚÖУ©µÄµØÖ·¡£

  3. Redassociation ÓÚ 2006-10-12 11:24:06·¢±í:

    ¡¡¡¡ÈÎÎñ¶ÓÁÐ

    ¡¡¡¡´Ó2.1.30¿ªÊ¼µÄLinux°æ±¾²»ÔÙ¶¨Ò庯Êýqueue_task_irqºÍqueue_task_irq_off£¬ÒòΪÔÚqueue_taskÉϵÄʵ¼Ê¼ÓËÙ²»ÖµµÃ»¨¾«Á¦Î¬»¤Á½¸ö¶ÀÁ¢µÄº¯Êý¡£µ±Ð»úÖƱ»¼Óµ½ºËÐÄʱ£¬Õâ¾Í±äµÃÃ÷ÏÔÁË¡£ÔÚÔ´Â뼶£¬ÕâÊÇ2.0ºÍ2.1Ö®¼äΨһµÄÇø±ð£»Í·Îļþ¶¨ÒåÁËÏûʧµÄº¯Êý¼ò»¯ÁË´Ó2.0ÒÆÖ²Çý¶¯³ÌÐò¡£¸ÐÐËȤµÄ¶ÁÕß¿ÉÒԲ鿴ÒÔ»ñµÃ¸ü¶àµÄϸ½Ú¡£

    ¡¡¡¡ÖжϹÜÀí

    ¡¡¡¡ÔÚ2.1µÄ¿ª·¢ÖУ¬ÓÐЩLinuxÄÚ²¿±»ÐÞ¸ÄÁË¡£ÐºËÐÄÌṩÁ˶ÔÄÚ²¿ËøµÄºÜºÃµÄ¹ÜÀí£»Í¨¹ýʹÓü¸¸öϸÁ£¶ÈµÄËø£¬¶ø²»ÊÇÈ«¾ÖµÄËø£¬¾ºÕùÌõ¼þ±»±ÜÃâÁË£¬ÕâÑùÒ²»ñµÃÁ˸üºÃµÄÐÔÄÜ----ÌرðÊÇSMPÅäÖÃÏ¡£¸üϸµÄËø»úÖƵÄÒ»¸ö½á¹ûÊÇintr_count²»ÔÙ´æÔÚÁË¡£2.1.34Å×ÆúÁËÕâ¸öÈ«¾Ö±äÁ¿£¬¶ø²¼¶ûº¯Êýin_interrupt¿ÉÒÔÈ¡¶ø´úÖ®£¨Õâ¸öº¯Êý´Ó2.1.30¿ªÊ¼´æÔÚ£©¡£Ä¿Ç°£¬in_interruptÊÇÔÚÍ·ÎļþÖÐÉùÃ÷µÄºê£¬Õâ¸öÍ·ÎļþÓÖ°üº¬ÔÚÖС£Í·Îļþsysdep-2.1.hÓÃintr_countµÄÃûÒ嶨ÒåÁËin_interruptÒÔ»ñµÃ¶Ô2.0µÄÏòºó¼æÈÝÐÔ¡£

    ¡¡¡¡×¢ÒâËäÈ»in_interruptÊǸöÕûÊý£¬intr_countÈ´ÊǸöunsigned long£¬Òò´Ë£¬Èç¹ûÄãÏë´òÓ¡Õâ¸öÖµ£¬²¢ÔÚ2.0ºÍ2.1¼ä¿ÉÒÆÖ²£¬Äã±ØÐëÇ¿Öƽ«Õâ¸öֵת»»ÎªÒ»¸öÏÔʽµÄÀàÐÍ£¬²¢ÔÚµ÷ÓÃprintkʱָ¶¨Ò»¸öºÏÊʵĸñʽ¡£ÔÚ2.1.37ÖÐÖжϹÜÀíÓÖÒýÈëÁËÒ»¸ö²»Í¬£º¿ìºÍÂýÖжϴ¦Àí³ÌÐò²»ÔÙ´æÔÚÁË¡£SA_INTERRUPT²»±»Ð°汾µÄrequest_irqʹÓ㬵«ËüÔÚ´¦Àí³ÌÐòÖ´ÐÐÒÔÇ°ÈÔÈ»¿ØÖÆ×ÅÖжÏÊÇ·ñ±»´ò¿ª¡£Èç¹û¼¸¸ö´¦Àí³ÌÐò¹²ÏíÒ»¸öÖжÏÏߣ¬Ã¿¸ö¿ÉÒÔÊǸö²»Í¬µÄ¡°ÀàÐÍ¡±¡£Öжϴò¿ªÓë·ñÒÀÀµÓÚµÚÒ»¸ö±»µ÷ÓõĴ¦Àí³ÌÐò¡£µ±Öжϴ¦Àí³ÌÐò´æÔÚʱ£¬Ï°벿×ÜÊÇÖ´ÐС£

    ¡¡¡¡Î»²Ù×÷

    ¡¡¡¡2.1.37ÉÔ΢¸Ä±äÁËÔÚÖж¨ÒåµÄλ²Ù×÷µÄ×÷Óá£ÏÖÔÚº¯Êýset_bit¼°ÆäÏà¹ØÕß·µ»Øvoid£¬¶øеÄÀàËÆtest_and_set_bitµÄº¯ÊýÒѱ»ÒýÈ롣еĺ¯Êý¼¯ÓÐÈçÏÂÔ­ÐÍ£º

    [code]void set_bit(int nr, volatile void * addr);
    void clear_bit(int nr, volatile void * addr);
    void change_bit(int nr, volatile void * addr);

    int test_and_set_bit(int nr, volatile void * addr);
    int test_and_clear_bit(int nr, volatile void * addr);
    int test_and_change_bit(int nr, volatile void * addr);
    int test_bit(nr, addr);[/code]

    ¡¡¡¡Èç¹ûÄãÏë»ñµÃÓë2.0µÄºóÏò¼æÈÝÐÔ£¬Äã¿ÉÒÔÔÚÄãµÄÄ£¿éÖаüº¬sysdep-2.1.h£¬²¢Ê¹ÓÃеÄÔ­ÐÍ¡£

    ¡¡¡¡×ª»»º¯Êý

    ¡¡¡¡°æ±¾2.1.10ÒýÈëÁËÒ»¸öеÄת»»º¯Êý£¬ÔÚÖÐÉùÃ÷¡£ÕâЩº¯Êý¿ÉÒÔÓÃÀ´·ÃÎʶà×Ö½ÚÖµ£¬Ö»ÒªÕâ¸öÖµÒÑÖªÊÇСӡµØ°²×Ö½ÚÐò»ò´óÓ¡µØ°²×Ö½ÚÐò¡£ÒòΪÕâЩº¯ÊýΪдÇý¶¯³ÌÐò´úÂëÌṩÁ˺ܺõĿì½Ý·½Ê½£¬Í·Îļþsysdep-2.1.hÔÚ½ÏÔçµÄ°æ±¾¾ÍÒѾ­¶¨ÒåÁËËüÃÇ¡£2.1ºËÐÄÔ´ÂëÌṩµÄ±¾ÉíʵÏÖ±Èsysdep-2.1.hÌṩµÄ¿ÉÒÆÖ²µÄʵÏÖÒª¿ì£¬ÒòΪËü¿ÉÒÔÀûÓÃÌåϵÏà¹ØµÄ¹¦ÄÜ¡£

    ¡¡¡¡Ðº¯Êý¶ÔÓ¦ÏÂÃæµÄÔ­ÐÍ£¬ÆäÖÐle±íʾСӡµØ°²×Ö½ÚÐò£¬be±íʾ´óÓ¡µØ°²×Ö½ÚÐò¡£×¢Òâ±àÒëÆ÷²¢²»Ç¿ÖÆÑϸñµÄÊý¾ÝÀàÐÍ»¯£¬ÒòΪ´ó¶àÊýº¯Êý¶¼ÊÇÔ¤´¦Àíºê£»ÏÂÃæ¸ø³öµÄÀàÐͽö¹©²Î¿¼¡£

    [code]¡¡¡¡__u16 cpu_to_le16(__u16 cpu_val);
    __u32 cpu_to_le32(__u32 cpu_val);
    __u16 cpu_to_be16(__u16 cpu_val);
    __u32 cpu_to_be32(__u32 cpu_val);
    __u16 le16_to_cpu(__u16 le_val);
    __u32 le32_to_cpu(__u32 le_val);
    __u16 be16_to_cpu(__u16 be_val);
    __u32 be32_to_cpu(__u32 be_val);[/code]

    ¡¡¡¡ÕâЩº¯ÊýÔÚ´¦Àí¶þ½øÖÆÊý¾ÝÁ÷ʱºÜÓÐÓã¨ÀýÈçÎļþϵͳÊý¾Ý»ò´æÔÚ½Ó¿Ú°åÖеÄÐÅÏ¢£©£¬ÕâЩº¯ÊýÔÚ´¦Àí¶þ½øÖÆÊý¾ÝÁ÷ʱºÜÓÐÓã¨ÀýÈçÎļþϵͳÊý¾Ý»ò´æÔÚ½Ó¿Ú°åÖеÄÐÅÏ¢£©£¬°æ±¾2.1.43ÓÖÔö¼ÓÁËÁ½¸öеÄת»»º¯Êý¼¯¡£ÕâЩ¼¯ÔÊÐíÄãÓÃÖ¸Õë»ñÈ¡Ò»¸öÖµ£¬»òÊǶԲÎÊýÖ¸¶¨µÄÒ»¸öÖµ½øÐо͵Øת»»¡£¶ÔÓ¦Óë16λСӡµØ°²×Ö½ÚÐòµÄº¯ÊýÓÖÈçϵÄÔ­ÐÍ£»ÀàËƵĺ¯Êý¶ÔÆäËüÀàÐ͵ÄÕûÊýÒ²´æÔÚ£¬µ¼ÖÂÒ»¹²16¸öº¯Êý¡£

    [code]__u16 cpu_to_le16p(__u16 *addr)
    __u16 le16_to_cpup(__u16 *addr)
    void cpu_to_le16s(__u16 *addr)
    void le16_to_cpus(__u16 *addr)[/code]

    ¡¡¡¡¡°p¡±º¯ÊýÀàËÆÓëÖ¸ÕëµÄ¸´ÒýÓ㬵«ÔÚÐèҪʱת»»Õâ¸öÖµ£»¡°s¡±º¯Êý¿ÉÒÔÔÚÔ­µØת»»Ò»¸öÖµµÄÓ¡µØ°²×Ö½ÚÐò£¨ÀýÈ磬cpu_to_le16s(addr) ºÍaddr=cpu_to_le16(*addr)Íê³ÉµÄ¹¤×÷ÊÇÒ»ÑùµÄ£©¡£

    ¡¡¡¡ÕâЩº¯ÊýÒ²ÔÚsysdep-2.1.hÖж¨ÒåÁË¡£ÎªÁ˱ÜÃâË«ÖؽâÊ͵ĸ±×÷Óã¬Õâ¸öÍ·ÎļþÓÃÏßÈ뺯Êý£¬¶ø²»ÊÇÔ¤´¦Àíºê¡£

    [code]vremap
    vremap[/code]

    ¡¡¡¡¡°°ÑÎÕÄڴ桱ÖС°vmallocºÍÅóÓÑÃÇ¡±Ò»½ÚÃèÊöµÄvremapº¯ÊýÔÚ°æ±¾2.1Öеõ½Ò»¸öÐÂÃû×Ö¡£Ðº¯ÊýioremapÖ»ÊÇÃû×Ö±äÁË£¬ËüÓë¾ÉµÄremapȡͬÑùµÄ²ÎÊý¡£ÏìÓ¦µÄÊͷź¯ÊýÊÇiounmap£¬Ëü´úÌævfreeÀ´Êͷű»ÖØÓ³ÉäµÄµØÖ·¡£Õâ¸ö¸Ä±äÊÇΪÁËÃ÷È·Õâ¸öº¯ÊýµÄʵ¼Ê×÷Ó㺽«I/O¿Õ¼äÖØÓ³Éäµ½ºËÐÄ¿Õ¼äµÄÒ»¸öÐéµØÖ·¡£Í·Îļþsysdep-2.1.hÇ¿»¯ÁËÕâÖÖйæÔò£¬µ±ÔÚ2.0°æ±¾±àÒëʱ£¬Ëü#defineÁËioremapºÍiounmapµ½ËüÃÇ2.0µÄ¶ÔÓ¦Õß¡£

  4. Redassociation ÓÚ 2006-10-12 11:22:44·¢±í:

    ¡¡¡¡Ê¹ÓÃеĽӿÚ

    ¡¡¡¡·ÃÎÊÓû§¿Õ¼äµÄеĺ¯Êý¼¯³õ¿´ÆðÀ´¿ÉÄÜÓеãÁîÈËʧÍû£¬µ«ËüÃǵÄȷʹ³ÌÐòÔ±µÄÈÕ×ӺùýµÄ¶àÁË¡£ÔÚLinux2.1ÉÏ£¬²»ÔÙÐèÒªÏÔʽµØ¼ì²éÓû§¿Õ¼ä£»access_okÒ»°ã²»ÐèÒªµ÷Óá£Ê¹ÓÃнӿڵĴúÂë¿ÉÒÔÖ±½Ó½øÐÐÊý¾Ý´«ËÍ¡£_retº¯ÊýÔÚʵÏÖϵͳµ÷ÓÃʱ֤Ã÷ÊÇÏ൱ÓÐÓõģ¬ÒòΪһ¸öÓû§¿Õ¼äµÄʧ°Üͨ³£µ¼ÖÂϵͳµ÷ÓõÄÒ»¸ö·µ»Ø-EFAULTµÄʧ°Ü¡£Òò´Ë£¬Ò»¸öµäÐ͵ÄreadʵÏÖ£¬¿´ÆðÀ´ÈçÏ£º

    [code]long new_read(struct inode *inode, struct file *filp, char *buf,
    unsigned long count);
    {
    /* identify your data (device-specific code) */
    if (__copy_to_user(buf, new_data, count))
    return -EFAULT;
    return count;
    }[/code]

    ¡¡¡¡×¢ÒâʹÓò»½øÐмì²éµÄ__copy_to_userÊÇÒòΪµ÷ÓÃÕßÔÚ°ÑÊý¾Ý´«Êä·ÖÅɵ½Îļþ²Ù×÷֮ǰÒѾ­¼ì²éÁËÓû§¿Õ¼ä¡£Õâ¾ÍÏó2.0£¬readºÍwrite²»ÐèÒªµ÷ÓÃverify_area¡£ÀàËƵأ¬µäÐ͵ÄioctlʵÏÖ¿´ÆðÀ´ÈçÏ£º

    [code]int new_ioctl(struct inode *inode, struct file *filp, unsigned int
    cmd, unsigned long arg);
    {
    /* device-specific checks, if needed */
    switch(cmd){
    case NEW_GETVALUE:
    put_user_ret(new_value, (int *)arg, -EFAULT);
    break;
    case NEW_SETVALUE:
    get_user_ret(new_value, (int *)arg, -EFAULT);
    default:

    return -EINVAL;
    }
    return 0;
    }[/code]

    ¡¡¡¡°æ±¾2.0µÄ¶ÔÓ¦Õß²»Í¬µÄÊÇ£¬Õâ¸öº¯ÊýÔÚswitchÓï¾ä֮ǰ²¢²»ÐèÒª¼ì²é²ÎÊý£¬ÒòΪÿ¸öget_user»òput_user»á½øÐмì²é¡£ÁíÒ»·½Ã棬µ±ÄãÏëд¿ÉÒÔͬʱÔÚ2.0ºÍ2.1ÉϱàÒëµÄ´úÂëʱ£¬ÎÊÌâ±äµÃÉÔ΢¸´ÔÓһЩ£¬ÒòΪÔÚÀϵĺËÐÄÉÏ£¬Äã²»ÄÜÓÃCÔ¤´¦ÀíÆ÷αװеÄÐÐΪ¡£Äã²»Äܼòµ¥µØ#defineÒ»¸ö½ÓÊÕÁ½¸ö²ÎÊýµÄget_userºê£¬ÒòΪʵ¼ÊµÄget_userʵÏÖÔÚ2.0ÖÐÒѾ­ÊǸöºê¡£ÎÒÔÚд¼È¿ÉÒÆÖ²ÓиßЧÂʵĴúÂëµÄÑ¡ÔñÊÇÉèÖÃsysdep-2.1.hÒÔÌṩ¾ßÓÐÏÂÁк¯ÊýµÄÔ´Âë¡£ÏÂÃæÖ»ÁгöÁ˶ÁÈ¡Êý¾ÝµÄº¯Êý£»Ð´Êý¾ÝµÄº¯ÊýÐÐΪÍêÈ«Ò»Ñù¡£

    [code]int access_ok(type, address, size);[/code]

    ¡¡¡¡µ±ÔÚ2.0ÉϱàÒëʱ£¬Õâ¸öº¯ÊýÒÔverify_areaµÄÃûÒåʵÏÖ¡£int verify_area_20(type, address, size);ͨ³££¬µ±ÎªLinux2.1д´úÂëʱ£¬Äã²»Ðèµ÷ÓÃaccess_ok¡£ÁíÒ»·½Ã棬µ±ÔÚLinux2.0ÉϱàÒëʱ£¬±ØÐëµ÷ÓÃverify_area¡£Õâ¸öº¯Êý¾ÍÊÇÒªÌîƽÕâ¸ö²»Í¬£ºµ±ÎªLinux2.1±àÒëʱ£¬ËüÀ©Õ¹Îª¿Õ£»¶øΪ2.0±àÒëʱ£¬ËüÀ©Õ¹ÎªÔ­À´µÄverify_area¡£Õâ¸öº¯Êý²»Äܱ»³Æ×överify_area£¬ÒòΪ2.1ÒѾ­ÓÐÒ»¸öºê½ÐÕâ¸öÃû×ÖÁË¡£ÔÚ2.1Öж¨ÒåµÄverify_areaºêʵÏÖÁËaccess_okµÄÀϵÄÓïÒ壬ËüµÄ´æÔÚÊÇΪÁ˼ò»¯Ô´Âë´Ó2.0µ½2.1µÄת»»¡££¨´ÓÀíÂÛÉÏ˵£¬Äã¿ÉÒÔÔÚÄãµÄÄ£¿éÖÐÁôÏÂverify_area£¬Ö»Êǽ«º¯ÊýÃû¸Äһϣ»ÕâÖÖ¼òµ¥ÒÆÖ²¼¼ÇɵÄȱµãÊÇа汾²»ÄÜÔÚ2.0ÉϱàÒë¡££©

    [code]int GET_USER(var, add);
    int __GET_USER(var, add);
    GET_USER_RET(var, add, ret);[/code]

    ¡¡¡¡µ±ÔÚ2.1ÉϱàÒëʱ£¬ÕâЩºêÀ©Õ¹ÎªÊµ¼ÊµÄget_userº¯Êý£¬¼´ÉÏÃæ½âÊ͹ýµÄÄÇЩ¡£µ±ÔÚ2.0ÉϱàÒëʱ£¬get_userµÄ2.0ʵÏÖ±»ÓÃÀ´ÊµÏÖÓë2.1ÖÐͬÑùµÄ¹¦ÄÜ¡£

    [code]int copy_from_user(to, from, size);
    int copy_from_user(to, from, size);
    int __copy_from_user(to, from, size);
    copy_from_user_ret(to, from, size);[/code]

    ¡¡¡¡µ±ÔÚ2.0ÉϱàÒëʱ£¬ÕâЩÀ©Õ¹Îªmemcpy_fromfs£»¶øÔÚ2.1ÉÏ£¬ÔòʹÓñ¾ÉíµÄº¯Êý¡£_retÒ»ÀàÔÚ2.0ÉÏ´Ó²»»á·µ»Ø£¬ÒòΪ¸´Öƺ¯Êý²»»áʧ°Ü¡£

    ¡¡¡¡ÎÒ¸öÈ˱ȽÏϲ»¶ÕâÖÖʵÏÖ¼æÈÝÐԵķ½·¨£¬µ«Õâ²¢²»ÊÇΨһµÄ·½·¨¡£ÔÚÎÒµÄʾÀý´úÂëÖУ¬ÈκÎÓû§¿Õ¼äµÄ·ÃÎÊ£¨³ýÁËÓÃÀ´read»òwriteµÄ»º³åÇø£¬ËüÃÇÒѾ­ÊÂÏȼì²é¹ýÁË£©Ö®Ç°£¬verify_area_20±ØÐë±»µ÷Óá£ÁíÒ»ÖÖ·½·¨¸ü¼ÓÖÒʵÓÚ2.1µÄÓïÒ壬¼´µ±ÓÃ2.0ʱ£¬ÔÚÿ¸öget_user ºÍcopy_from_user֮ǰ×Ô¶¯Éú³ÉÒ»¸överify_area¡£Õâ¸öÑ¡ÔñÔÚÔ´Â뼶Ҫ¸üÇåÎúһЩ£¬µ«ÔÚ°æ±¾2.0ÉϱàÒëʱЧÂÊÏ൱µÍ£¬°üÀ¨´úÂë´óСºÍÖ´ÐÐʱ¼ä¡£¿ÉÒÔͬʱÔÚ2.0ºÍ2.1ÉϱàÒëµÄʾÀý´úÂ룬ÈçscullÄ£¿é£¬¿ÉÒÔÔÚĿ¼v2.1/scullÖÐÕÒµ½¡£ÎÒ²»¾õµÃÕâ¸ö´úÂë×ã¹»ÓÐȤ£¬Òò´Ë²»ÔÚÕâÀï¸ø³ö¡£

  5. Redassociation ÓÚ 2006-10-12 11:21:34·¢±í:

    ¡¡¡¡·ÃÎÊÓû§¿Õ¼ä

    ¡¡¡¡ºËÐĵĵÚÒ»¸ö2.1°æÒýÈëÁËÒ»ÖÖ´ÓºËÐÄ´úÂë·ÃÎÊÓû§¿Õ¼äµÄУ¨¸üºÃ£©·½·¨¡£Õâ¸ö¸Ä±äÐÞÕýÁËÒ»¸ö³¤ÆÚ´æÔڵĴíÎóÐÐΪ²¢ÔöÇ¿ÁËϵͳµÄÐÔÄÜ¡£µ±ÄãλºËÐÄ2.1±àÒë´úÂ룬²¢ÐèÒª·ÃÎÊÓû§¿Õ¼äʱ£¬ÄãÐèÒª°üº¬£¬¶ø²»ÊÇ¡£Ä㻹±ØÐëʹÓÃÒ»¸öÓë2.0²»Í¬µÄº¯Êý¼¯¡£²»ÓÃ˵£¬Í·Îļþsysdep-2.1.h¾¡¿ÉÄܵØÕÕ¹ËÁËÕâЩ²»Í¬£¬ÔÊÐíÄãÔÚ2.0ÉϱàÒëʱʹÓÃ2.1µÄÓïÒå¡£ÔÚÓû§·ÃÎÊÖÐ×îÁîÈË×¢ÒâµÄ²»Í¬Ê±verify_areaûÓÐÁË£¬ÒòΪ¶àÊýÑéÖ¤¶¼ÓÉCPUÍê³ÉÁË¡£¹ØÓÚÕâ¸öÖ÷ÌâµÄϸ½Ú¼û±¾ÕºóÃæµÄ¡°´¦ÀíºËÐÄ¿Õ¼ä´íÎ󡱡£

    ¡¡¡¡¿É±»ÓÃÀ´·ÃÎÊÓû§¿Õ¼äµÄеĺ¯Êý¼¯ÊÇ£º

    [code]int access_ok(int type, unsigned long addr, unsigned long size);[/code]

    ¡¡¡¡Èç¹ûµ±Ç°½ø³Ì±»ÔÊÐí·ÃÎʵØÖ·addr´¦µÄÄڴ棬º¯Êý·µ»ØÕ棨1£©£¬·ñÔòΪ¼Ù£¨0£©¡£Õâ¸öº¯ÊýÈ¡´úverify_area£¬¾¡¹ÜËü½øÐнÏÉٵļì²é¡£ºÍÀϵÄverify_area½ÓÊÕÒ»ÑùµÄ²ÎÊý£¬µ«ÊÇÒª¿ìµÄ¶à¡£ÔÚÄ㸴ÒýÓÃÒ»¸öÓû§¿Õ¼äµØַ֮ǰ£¬Õâ¸öº¯ÊýÓ¦¸Ã±»µ÷ÓöÔÖ®½øÐмì²é£»Èç¹ûÄãûÓмì²é£¬Óû§ÓпÉÄÜ»á·ÃÎʺÍÐ޸ĺËÐÄÄÚ´æ¡£±¾ÕºóÃæµÄ¡°ÐéÄâÄڴ桱һ½Ú¸üϸÖµؽâÊÍÁËÕâ¸öÎÊÌâ¡£ÐÒÔ˵ÄÊÇ£¬ÏÂÃæÃèÊöµÄ´ó¶àÊýº¯Êý¶¼ÌæÄã½øÐÐÁËÕâ¸ö¼ì²é£¬Òò´ËÄãʵ¼ÊÉϲ¢²»ÐèÒªµ÷ÓÃaccess_ok£¬³ý·ÇÄãÑ¡ÔñÕâÑù×ö¡£Òò´ËÄãʵ¼ÊÉϲ¢²»ÐèÒªµ÷ÓÃaccess_ok£¬³ý·ÇÄãÑ¡ÔñÕâÑù×ö¡£int get_user(lvalue, address);ÔÚ2.1ºËÖÐʹÓõĺêget_userÓëÎÒÃÇÔÚ2.0ÖÐʹÓõIJ¢²»Ïàͬ¡£Æä·µ»ØÖµÔڳɹ¦Ê±Îª0£¬·ñÔòΪһ¸ö¸ºµÄ´íÎó´úÂ루×ÜÊÇ-EFAULT£©¡£Õâ¸öº¯ÊýµÄ¾»Ð§¹ûÊǽ«´ÓµØÖ·addressÈ¡µÃµÄÊý¾Ý¸³¸ølvalue¡£ÔÚͨ³£µÄCÓïÑÔº¬ÒåÖУ¬Õâ¸öºêµÄµÚÒ»¸ö²ÎÊý±ØÐëÊÇÒ»¸ölvalue*¡£Óë2.0°æÖеÄÕâ¸öº¯ÊýÀàËÆ£¬Êý¾ÝÏîµÄʵ¼Ê´óСÒÀÀµÓÚaddress²ÎÊýÀàÐÍ¡£Õâ¸öº¯ÊýÔÚÄÚ²¿µ÷ÓÃaccess_ok¡£

    [code]int __get_user(lvalue, address);[/code]

    ¡¡¡¡Õâ¸öº¯ÊýÍêÈ«ÀàËÆget_user£¬µ«Ëü²»ÄÚ²¿µ÷ÓÃaccess_ok¡£µ±Äã·ÃÎÊÒ»¸öÒѾ­´ÓͬһºËÐĺ¯ÊýÄÚ²¿¼ì²é¹ýµÄÓû§µØַʱ£¬ÄãÓ¦¸Ãµ÷ÓÃ__get_user¡£

    [code]get_user_ret(lvalue, address, retval);[/code]

    ¡¡¡¡Õâ¸öºêÊǵ÷ÓÃget_userµÄ¿ì½Ý·½Ê½£¬Èç¹ûº¯Êýʧ°ÜÔò·µ»Øretval¡£

    [code]int put_user(expression, address);
    int __put_user(expression, address);
    put_user_ret(expression, address, retval);[/code]

    ¡¡¡¡ÕâЩº¯ÊýÓëËüÃǵÄget_¶ÔÓ¦Õ߷dz£ÀàËÆ£¬Ö»ÊÇËüÃÇÊÇÏòÓû§¿Õ¼äд£¬¶ø²»ÊǶÁ¡£³É¹¦Ê±£¬Öµexpression±»Ð´µ½µØÖ·address¡£

    [code]unsigned long copy_from_user(unsigned long to, unsigned long from, unsigned
    long len);[/code]

    ¡¡¡¡Õâ¸öº¯Êý´ÓÓû§¿Õ¼ä¸´ÖÆÊý¾Ýµ½ºËÐĿռ䡣Ëü´úÌæ¾ÉµÄmemcpy_tofsµ÷Óá£Õâ¸öº¯ÊýÄÚ²¿µ÷ÓÃaccess_ok¡£·µ»ØÖµÊÇδÄÜ´«Ë͵Ä×Ö½ÚÊý¡£ÕâÑù£¬Èç¹û·¢Éú´íÎ󣬷µ»ØÖµ±ØÈ»´óÓÚ0£»ÔÚÄÇÖÖÇé¿öÏ£¬Çý¶¯³ÌÐò·µ»Ø-EFAULT£¬ÒòΪ´íÎóÊÇÓÉ´íÎóµÄÄÚ´æ·ÃÎÊÒýÆðµÄ¡£

    [code]unsigned long __copy_from_user(unsigned long to, unsigned long from,
    unsigned long len);[/code]

    ¡¡¡¡Õâ¸öº¯ÊýÓëcopy_from_userÒ»Ñù£¬µ«Ëü²»ÄÚ²¿µ÷ÓÃaccess_ok¡£

    [code]caopy_from_user_ret(to, from, len, retval);[/code]

    ¡¡¡¡Õâ¸öºêÊÇÄÚ²¿µ÷ÓÃcopy_from_userµÄ¿ì½Ý·½Ê½£»Èç¹ûʧ°Ü£¬Ôò´Óµ±Ç°º¯Êý·µ»Ø¡£

    [code]unsigned long copy_to_user(unsigned long to, unsigned long from, unsigned
    unsigned long copy_to_user(unsigned long to, unsigned long from, unsigned
    long len);
    unsigned long __copy_to_user(unsigned long to, unsigned long from, unsigned
    long len);
    copy_to_user(to, from, len, retval);[/code]

    ¡¡¡¡ÕâЩº¯Êý±»ÓÃÀ´½«Êý¾Ý¸´ÖƵ½Óû§¿Õ¼ä£¬ËüÃǵÄÐÐΪ·Ç³£ÀàËÆÓÚËüÃǵÄcopy_fromµÄ¶ÔÓ¦Õß¡£2.1°æºËÐÄ»¹¶¨ÒåÁËÆäËü·ÃÎÊÓû§¿Õ¼äµÄº¯Êý£ºclear_user£¬strncpy_from_user£¬ºÍstrlen_user¡£ÎÒ²»´òËãÌÖÂÛËüÃÇÁË£¬ÒòΪLinux2.0ÖÐûÓÐÕâЩº¯Êý£¬²¢ÇÒÇý¶¯³ÌÐòµÄ´úÂëÒ²ºÜÉÙÓõ½ËüÃÇ¡£ÓÐÐËȤµÄ¶ÁÕß¿ÉÒÔ¿´¿´¡£

  6. Redassociation ÓÚ 2006-10-12 11:20:14·¢±í:

    ¡¡¡¡poll·½·¨

    ¡¡¡¡2.1.23ÒýÈëÁËpollϵͳµ÷Óã¬ËüÊÇsystem VÖÐselectµÄ¶ÔÓ¦Õߣ¨ÓÉBSD UnixÒýÈ룩¡£²»ÐÒµÄÊDz»¿ÉÄÜÔÚselectÉ豸·½·¨Ö®ÉÏʵÏÖpollµÄ¹¦ÄÜ£¬ËùÒÔÕû¸öʵÏÖÓò»Í¬µÄÒ»¸ö´úÌ棬Ëü×÷ΪselectºÍpollµÄºó¶Ë¡£

    ¡¡¡¡ÔÚµ±Ç°°æ±¾µÄºËÐÄÖУ¬file_operationsÖеÄÉ豸·½·¨Ò²½Ðpoll£¬Óëϵͳµ÷ÓÃÀàËÆ£¬ÒòΪÆäÄÚ²¿Ä£·ÂÕâ¸öϵͳµ÷Óá£Õâ¸ö·½·¨µÄÔ­ÐÍÊÇ£ºunsigned int (*poll) (struct file *, poll_table *);

    ¡¡¡¡Çý¶¯³ÌÐòÖÐÉ豸Ìض¨µÄʵÏÖÖ÷ÒªÍê³ÉÁ½¸öÈÎÎñ£º

    ¡¡¡¡l ÔÚÒ»¸ö¿ÉÄÜÔÚ½«À´»½ÐÑËüµÄµÈ´ý¶ÓÁÐÖн«µ±Ç°½ø³ÌÅŶӡ£Í¨³££¬ÕâÒâζ×ÅͬʱÔÚÊäÈëºÍÊä³ö¶ÓÁÐÖжԽø³ÌÅŶӡ£º¯Êýpoll_wait±»ÓÃÓÚÕâ¸öÄ¿µÄ£¬Æ乤×÷·½Ê½Óëselect_wait·Ç³£ÀàËÆ£¨Ï¸½ÚÇë¿´µÚÎåÕ¡°ÔöÇ¿µÄ×Ö·ûÉ豸Çý¶¯³ÌÐò²Ù×÷¡±ÖС°select¡±Ò»½Ú£©¡£

    ¡¡¡¡2 ¹¹ÔìÒ»¸öλÑÚÂëÃèÊöÉ豸µÄ״̬£¬²¢½«Æä·µ»Ø¸øµ÷ÓÃÕß¡£ÕâЩλµÄÖµÊÇƽ̨Ìض¨µÄ£¬ÔÚÖж¨Ò壬Ëü±ØÐë±»°üº¬ÔÚÇý¶¯³ÌÐòÖС£ÔÚ½²ÊöλÑÚÂëµÄÿһλǰ£¬ÎÒÏë¸ø³öÒ»¸öµäÐ͵ÄʵÏÖ¡£ÏÂÃæµÄº¯ÊýÊÇv2.1/scull/pipe.cµÄÒ»²¿·Ö£¬ÊÇ/dev/scullpipeµÄpoll·½·¨µÄʵÏÖ¡£scullpipeµÄÄÚ²¿ÔÚµÚÎåÕ½éÉܹý¡£

    ¡¡¡¡ÈçÄãËù¿´µ½µÄ£¬Õâ¸ö´úÂëÏ൱¼òµ¥¡£Ëü±È¶ÔÓ¦µÄselect·½·¨ÒªÈÝÒס£ÖÁÓÚselect£¬×´Ì¬Î»¼ÆΪ¡°¿É¶Á¡±¡¢¡°¿Éд¡±£¬»ò¡°·¢ÉúÀýÍ⡱£¨ÕâÊÇselectµÄµÚÈý¸öÌõ¼þ£©¡£poll¸÷λµÄÍêÈ«ÁбíÔÚÏÂÃæ¸ø³ö¡£¡°ÊäÈ롱λÁÐÔÚÇ°Ã棬ȻºóÊÇ¡°Êä³ö¡±£¬Ò»¸ö¡°ÀýÍ⡱λÁÐÔÚ×îºó¡£

    ¡¡¡¡POLLINÈç¹ûÉ豸¿ÉÒÔ±»ÎÞ×èÈûµØ¶Á£¬ÄÇôÕâ¸öλ±ØÐë±»ÉèÖá£

    ¡¡¡¡POLLRDNORMÈç¹û¡°Ò»°ã¡±Êý¾Ý¿ÉÒÔ±»¶Á£¬Õâ¸öλ±ØÐë±»Éè¡£Ò»¸ö¿É¶ÁÉ豸·µ»Ø£¨POLLIN |

    ¡¡¡¡POLLRDNORM£©¡£POLLRDBANDÔÚÄ¿Ç°µÄºËÐÄÔ´ÂëÖÐÕâ¸öλ²»±»Ê¹Óá£Unix System VʹÓÃÕâ¸ö뱨¸æ·Ç0ÓÅÏȼ¶µÄÊý¾Ý¿É¶Á¡£Êý¾ÝÓÅÏȼ¶µÄ¸ÅÄîÓë¡°Streams¡±°üÏà¹Ø¡£

    ¡¡¡¡POLLHUPµ±Ò»¸ö¶ÁÉ豸µÄ½ø³Ì¿´µ½Îļþ½áβʱ£¬Çý¶¯³ÌÐò±ØÐëÉèÖÃPOLLHUP(¹ÒÆð)¡£Ò»¸öµ÷ÓÃselectµÄ½ø³Ì½«±»¸æÖªÉ豸¿É¶Á£¬ÕâÓÉselectµÄ¹¦ÄÜ˵Ã÷¡£

    ¡¡¡¡POLLERRÉ豸ÉÏ·¢ÉúÁËÒ»¸ö´íÎóÌõ¼þ¡£µ±poll±»selectϵͳµ÷Óõ÷ÓÃʱ£¬É豸±»±¨¸æΪ¼È¿É¶ÁÓÖ¿Éд£¬ÒòΪread»òwrite½«ÎÞ×èÈûµØ·µ»ØÒ»¸ö´íÎó´úÂë¡£

    ¡¡¡¡POLLOUTÈç¹ûÉ豸¿ÉÒÔ±»ÎÞ×èÈûµØд£¬Õâ¸öλÔÚ·µ»ØÖµÖб»ÉèÖá£

    ¡¡¡¡POLLWRNORMÕâ¸öλÓëPOLLOUTÓÐÏàͬµÄº¬Ò壬ÓÐʱÉõÖÁµÄȷΪͬһ¸öÊý¡£Ò»¸ö¿ÉдµÄÉ豸·µ£¨POLLOUT | POLLWRNORM£©¡£

    ¡¡¡¡POLLWRBANDÓëPOLLRDBANDÀàËÆ£¬Õâ¸öλÒâζ×Å·Ç0ÓÅÏȼ¶µÄÊý¾Ý¿ÉÒÔ±»Ð´µ½É豸¡£Ö»ÓÐpollµÄ¡°Êý¾Ý

    ¡¡¡¡±¨¡±ÊµÏÖÓõ½×Å룬ÒòΪһ¸öÊý¾Ý±¨¿ÉÒÔ´«ËÍ¡°ÎÞÍŶÓÊý¾Ý£¨out-of-band data£©¡±¡£select±¨¸æÉ豸ÊÇ¿ÉдµÄ¡£

    ¡¡¡¡POLLPRI¸ßÓÅÏȼ¶µÄÊý¾Ý£¨¡°ÎÞÍŶӵġ±£©¿ÉÒÔ±»ÎÞ×èÈûµØ¶ÁÈ¡¡£Õâ¸öλµ¼ÖÂselect±¨¸æÎļþÉÏ·¢ÉúÁËÒ»¸öÀýÍâÌõ¼þ£¬ÒòΪselect½«ÎÞÍŶӰü×÷Ϊһ¸öÀýÍâÌõ¼þ±¨¸æ¡£

    ¡¡¡¡pollµÄÖ÷ÒªÎÊÌâÊÇËüÓë2.0ºËÐÄËùʹÓõÄselect·½·¨Ã»ÓÐÈκιØϵ¡£Òò´Ë£¬´¦ÀíÕâ¸ö²»Í¬µÄ×îºÃ·½·¨ÊÇʹÓÃÌõ¼þ±àÒëÀ´±àÒëºÏÊʵĺ¯Êý£¬¶øÇÒͬʱ½«ËüÃǶ¼°üº¬ÔÚÔ´ÎļþÖС£Èç¹ûµ±Ç°°æ±¾Ö§³Öselect¶ø²»ÊÇpoll£¬ÄÇôͷÎļþsysdep-2.1.h¶¨Òå·ûºÅ__USE_OLD_SELECT__¡£Õ⽫Äã´ÓÔÚÔ´ÂëÖбØÐëÒýÓÃLINUX_VERSION_CODEÖнâÍѳöÀ´¡£ÕâÁ½¸öº¯ÊýÓÃͬÑùµÄÃû×Öµ÷Óã¬ÒòΪÔڽṹsample_fopsÖÐsample_poll±»ÒýÓã¬ÄÇÀïpollÎļþ²Ù×÷´úÌæÁËselect·½·¨¡£

  7. Redassociation ÓÚ 2006-10-12 11:19:27·¢±í:

    ¡¡¡¡ÔÚÕâ¸öÆÁÄ»¿ìÕÕÖУ¬ipv6ûÓÐʹÓüÆÊý£¬²¢ÒÀÀµÓÚnetlink£»floppyÒѾ­±»kerneld¼ÓÔØ£¬ÓÉ¡°autoclean¡±±êÖ¾¸ø³ö£¬monitorÊÇÎÒµÄÒ»¸öС¹¤¾ß£¬¿ØÖÆһЩ״̬µÆ£¬²¢ÔÚϵͳÖÕֹʱ¹ØµôÎҵļÆËã»ú¡£ÈçÄãËù¿´µ½µÄ£¬ËüÊÇ¡°unused¡±£¬ÎÒ²¢²»¹ØÐÄËüµÄʹÓüÆÊý¡£

    ¡¡¡¡Îļþ²Ù×÷

    ¡¡¡¡Óм¸¸öÎļþ²Ù×÷ÔÚ2.1ÀïÓë2.0Óв»Í¬µÄÔ­ÐÍ¡£ÕâÖ÷ÒªÊdzöÓÚ´¦Àí´óС²»ÄÜ·ÅÈë32λµÄÎļþµÄÐèÒª¡£Æ䲻ͬÓÉÍ·Îļþsysdep-2.1.h´¦Àí£¬Ëü¸ù¾ÝʹÓõĺËÐÄ°æ±¾¶¨ÒåÁ˼¸¸öαÀàÐÍ¡£Îļþ²Ù×÷ÖÐÒýÈëµÄ½öÓеÄÏÔÖø´´ÐÂÊÇpoll·½·¨£¬ËüÓÃÍêÈ«²»Í¬µÄʵÏÖ´úÌæÁËselect·½·¨¡£

    ¡¡¡¡Ô­Ð͵IJ»Í¬

    ¡¡¡¡ËĸöÎļþ²Ù×÷±íÕ÷Ò»¸öеÄÔ­ÐÍ£»ËüÃÇÊÇ£º

    [code]long long (*llseek) (struct inode *, struct file *, long long, int);
    long (*read) (struct inode *, struct fle *, char *, unsigned long);
    long (*write) (struct inode *, struct file *, const char *, unsigned long);
    int (*release) (struct inode *, struct file *);[/code]

    ¡¡¡¡ËüÃÇÔÚ2.0ÖеĶÔÓ¦ÕßÊÇ£º

    [code] int (*lseek) (struct inode *, struct file *, off_t, int);
    int (*read) (struct inode *, struct file *, char *, int);
    int (*write) (struct inode *, struct file *, const char *, int);
    void (*release) (struct inode *, struct file *);[/code]

    ¡¡¡¡ÈçÄãËù¼ûµÄ£¬Æ䲻ͬÔÚÓÚËüÃǵķµ»ØÖµ£¨ËüÔÊÐíÁ˸ü´óµÄ·¶Î§£©£¬»¹ÓÐcountºÍoffset²ÎÊý¡£Í·Îļþsysdep-2.1.hͨ¹ý¶¨ÒåÏÂÃæµÄºê´¦ÀíÕâЩ²»Í¬£º

    ¡¡¡¡read_write_tÕâ¸öºêÀ©Õ¹Îª²ÎÊýcountµÄÀàÐÍÒÔ¼°readºÍwriteµÄ·µ»ØÖµ¡£

    ¡¡¡¡lssek_tÕâ¸öºêÀ©Õ¹ÎªllseekµÄ·µ»ØÖµÀàÐÍ¡£·½·¨Ãû×ֵĸı䣨´Ólseekµ½llseek£©²¢²»ÊǸöÎÊÌ⣬ÒòΪÄãÒ»°ãÔÚfile_operationsÖв¢²»ÓÃÃû×Ö¶ÔÓò¸³Öµ£¬¶øÊÇÉùÃ÷Ò»¸ö¾²Ì¬½á¹¹¡£

    ¡¡¡¡lseek_off_t lseekµÄoffset²ÎÊý¡£

    ¡¡¡¡release_t release·½·¨µÄ·µ»ØÖµ£»»òΪvoid»òΪint¡£

    ¡¡¡¡release_return( int return_value)Õâ¸öºê¿ÉÒÔÓÃÀ´´Órelease·½·¨·µ»Ø¡£ËüµÄ²ÎÊýÓÃÀ´·µ»ØÒ»¸ö´íÎó´úÂ룺0±íʾ³É¹¦£¬¸ºÖµ±íʾʧ°Ü¡£ÔÚ±È2.1.31ÀϵĺËÐÄÖУ¬Õâ¸öºêÀ©Õ¹Îªreturn£¬ÒòΪÕâ¸ö·½·¨·µ»Øvoid¡£

    ¡¡¡¡ÓÃÇ°ÃæµÄºê£¬Ò»¸ö¿ÉÒÆÖ²µÄÇý¶¯³ÌÐòÔ­ÐÍÊÇ£º

    [code]lseek_t my_lseek(struct inode *, struct file *, lseek_off_t, int);
    read_write_t my_read(struct inode *, struct file *, char *, count_t);
    read_write_t my_write(struct inode *, struct file *, const char *,
    count_t);
    release_t my_release(struct inode *, struct file *);[/code]

  8. Redassociation ÓÚ 2006-10-12 11:18:21·¢±í:

    ¡¡¡¡ºËÐÄÄ£¿éµÄеÄʵÏÖÀûÓÃÁËELF¶þ½øÖƸñʽµÄÌØÕ÷ÒÔ»ñµÃ¸üºÃµÄÁé»îÐÔ¡£¸üÌرðµØ£¬µ±¹¹ºËÐÄÄ£¿éµÄеÄʵÏÖÀûÓÃÁËELF¶þ½øÖƸñʽµÄÌØÕ÷ÒÔ»ñµÃ¸üºÃµÄÁé»îÐÔ¡£¸üÌرðµØ£¬µ±¹¹ÔìÒ»¸öELFÄ¿±êÎļþʱ£¬Äã¿ÉÒÔÉùÃ÷³ý¡°ÕýÎÄ¡±¡¢¡°Êý¾Ý¡±ºÍ¡°bss¡±Ö®ÍâµÄ½Ú¡£Ò»¸ö¡°½Ú¡±ÊÇÒ»¸öÁ¬ÐøµÄÊý¾ÝÇøÓò£¬Óë¡°¶Î¡±µÄ¸ÅÄîÀàËÆ¡£

    ¡¡¡¡¶ÔÓÚ2.1£¬ºËÐÄÄ£¿é±ØÐëʹÓÃELF¶þ½øÖƸñʽ±àÒë¡£ÊÂʵÉÏ£¬2.1ºËÐÄÀûÓÃÁËELFµÄ½Ú£¨¼û¡°´¦ÀíºËÐÄ¿Õ¼ä´íÎó¡±£©£¬Ö»ÄܱàÒëΪELF¡£Òò´ËÄ£¿éµÄÏÞÖƲ¢²»ÊǸöÕæÕýÏÞÖÆ¡£Ê¹ÓÃELFÔÊÐíÐÅÏ¢Óò±»´æÔÚÄ¿±êÎļþÖС£ºÃÆæµÄ¶ÁÕß¿ÉÒÔʹÓÃobjdump -section-headersÀ´¹Û²ì½ÚÍ·£¬ÓÃobjdump -section=.modinfo -full-contentsÀ´²é¿´Ä£¿éÌض¨µÄÐÅÏ¢¡£Êµ¼ÊÉÏ£¬.modinfoÒ»½ÚÊÇÓÃÀ´´æ´¢Ä£¿éÐÅÏ¢µÄ½Ú£¬°üº¬±»³Æ×ö¡°²ÎÊý¡±µÄÖµ£¬¿ÉÒÔÔÚ¼ÓÔØʱÐ޸ġ£

    ¡¡¡¡µ±ÔÚ2.1ÉϱàÒëʱ£¬Ò»¸ö²ÎÊý¿ÉÒÔÓúêÈçÏÂÉùÃ÷£ºMODULE_PARM(variable, type-description)£»µ±ÄãÔÚÔ´ÎļþÖÐʹÓÃÕâ¸öºêʱ£¬±àÒëÆ÷±»¸æÖªÔÚÄ¿±êÎļþÖвåÈëÒ»¸öÃèÊö´®£»Õâ¸öÃèÊö±íÃ÷variableÊǸö²ÎÊý£¬ËüµÄÀàÐͶÔÓ¦ÓÚtype-description¡£insmodºÍmodprobe²é¿´Ä¿±êÎļþ£¬±£Ö¤Äã±»ÔÊÐíÐÞ¸Ävariable£¬Í¬Ê±¼ì²é²ÎÊýµÄʵ¼ÊÀàÐÍ¡£ÀàÐͼì²é¶Ô·ÀÖ¹²»Óä¿ìµÄ´íÎó·Ç³£ÖØÒª£¬ÀýÈçÓÃÒ»¸ö´®¸²¸ÇÁËÒ»¸öÕûÊý£¬»ò´í°Ñ³¤ÕûÊýµ±³ÉÁ˶ÌÕûÊý¡£°´ÎҵĹ۵㣬½²ÊöºêµÄ×îºÃ°ì·¨Ê±¸ø³ö¼¸ÐÐʾÀý´úÂë¡£ÏÂÃæµÄ´úÂëÊôÓÚÒ»¸öÏëÏóµÄÍø¿¨type-description´®ÔÚÍ·ÎļþÖб»·Ç³£ÏêϸµØ½éÉÜ£¬²¢ÇÒΪÁËÄãµÄ·½±ã£¬Ëü¿ÉÒÔÔÚÕû¸öºËÐÄÔ´ÂëÖÐÕÒµ½¡£ÖµµÃ¸ø³öµÄÒ»¸ö¼¼ÇÉÊÇÈçºÎ²ÎÊý»¯Ò»¸öÊý×éµÄ³¤¶È£¬ÏóÉÏÃæµÄio¡£ÀýÈ磬ÉèÏëÍøÂçÇý¶¯³ÌÐòÖ§³ÖµÄÍâΧ°å×ÓµÄÊýÄ¿ÓкêMAX_DEVICES±íʾ£¬¶ø²»ÊÇӲдÈëµÄÊý×Ö4¡£³öÓÚÕâ¸öÄ¿µÄ£¬Í·Îļþ¶¨ÒåÁËÒ»¸öºê£¨__MODULE_STRING£©£¬ËüÓÃCÔ¤´¦ÀíÆ÷½«Ò»¸öºê¡°×Ö·û´®»¯¡±¡£Õâ¸öºê¿ÉÒÔÈçÏÂʹÓãº

    [code]int io[MAX_DEVICES+1]={0,};
    MODULE_PARM(io, ¡°1-¡± __MODULE_STRING(MAX_DEVICES) ¡°i¡±);[/code]

    ¡¡¡¡ÔÚÇ°Ò»ÐÐÖУ¬±»¡°×Ö·û´®»¯¡±µÄÖµÓëÆäËû´®½ÓÔÚÒ»Æð¹¹³ÉÄ¿±êÎļþÖÐÓÐÒâÒåµÄ´®¡£scullʾÀýÄ£¿éÒ²ÓÃMODULE_PARMÀ´ÉùÃ÷ËüµÄ²ÎÊý£¨scull_majorºÍÆäËûÕûÊý±äÁ¿£©¡£ÕâÔÚLinux2.0ÉϱàÒëʱ¿ÉÄÜ»á³öÎÊÌ⣬ÄÇÀïÕâ¸öºê䶨Òå¡£ÎÒÑ¡ÔñµÄ¼òµ¥µÄÐÞÕýÊÇÔÚsysdep-2.1.hÖж¨ÒåMODULE_PARM£¬ÕâÑùÔÚÓë2.0Í·Îļþ±àÒëʱ£¬ËüÀ©Õ¹Îª¿ÕÓï¾ä¡£ÆäËüÓÐÒâÒåµÄÖµ¿ÉÒÔÏóMODULE_AUTHOR()Ò»Ñù ´æÔÚÄ£¿éµÄ.modinfoÒ»½Ú£¬µ«ËüÃÇĿǰûÓÐʹÓá£Çë²Î¿¼ÒÔ»ñµÃ¸ü¶àµÄÐÅÏ¢¡£

    ¡¡¡¡/proc/modules

    ¡¡¡¡/proc/modulesµÄ¸ñʽÔÚ2.1.18ÖÐÂÔÓиı䣬¶øËùÓеÄÄ£¿é»¯´úÂ붼±»ÖØдÁË¡£¾¡¹ÜÕâ¸ö¸Ä±ä²¢²»Ó°ÏìÔ´Â룬Äã¿ÉÄܶÔÆäϸ½Ú²»¸ÐÐËȤ£¬ÒòΪ/proc/modulesÔÚÄ£¿é¿ª·¢Ê±¾­³£±»¼ì²é¡£

    ¡¡¡¡Ð¸ñʽºÍ¾ÉµÄÒ»ÑùÊÇÃæÏòÐеģ¬Ã¿Ðаüº¬ÏÂÃæµÄÓò£º

    ¡¡¡¡Ä£¿éÃû:Õâ¸öÓòÓëLinux2.0Ïàͬ¡£

    ¡¡¡¡Ä£¿é´ó:СÕâÊǸöÊ®½øÖÆÊý£¬ÒÔ×Ö½ÚΪµ¥Î»£¨¶ø²»ÊÇÄÚ´æÒ³£©±¨¸æ³¤¶È¡£Õâ¸öÄ£¿éµÄʹÓüÆÊýÈç¹ûÄ£¿éûÓÐʹÓüÆÊý£¬Õâ¸ö¼ÆÊý±¨¸æ-1¡£ÕâÊǺÍеÄÄ£¿é»¯´úÂëÒ»µÀÒýÈëµÄÐÂÌØÕ÷£»Äã¿ÉÒÔдһ¸öÄ£¿é£¬ËüµÄÈ¥³ý¿ÉÒÔÓÐÒ»¸öº¯Êý¿ØÖƶø²»ÊÇʹÓüÆÊý¡£Õâ¸öº¯ÊýÅжÏÄ£¿éÊÇ·ñÄܹ»±»Ð¶ÔØ¡£ÀýÈ磬ipv6Ä£¿é¾ÍʹÓÃÕâ¸öÌØÕ÷¡£

    ¡¡¡¡¿ÉÑ¡±êÖ¾

    ¡¡¡¡±êÖ¾ÊÇÎı¾´®£¬Ã¿¸ö¶¼ÓÉÀ¨ºÅ°üº¬£¬²¢ÓÉ¿Õ¸ñ·Ö¸ô¡£²Î¿¼±¾Ä£¿éµÄÄ£¿éÁÐ±í¡£Õâ¸öÁбíÕûÌå±»°üº¬ÔÚ·½À¨ºÅÄÚ£¬±íÖеĵ¥¸öÃû×ÖÓÉ¿Õ¸ñ¸ô¿ª¡£

    ¡¡¡¡ÏÂÃæÊÇ/proc/modulesÔÚ2.1.43ÖеĿÉÄÜÄÚÈÝ£º

    [code]morgana% cat /proc/modules
    ipv6 57164 -1
    netlink 3180 0 [ipv6]
    floppy 45960 1 (autoclean)
    floppy 45960 1 (autoclean)
    monitor 516 0 (unused)[/code]