¡¡¡¡Ò».Ç°ÑÔ
¡¡¡¡LinuxµÄÔ´ÂëÀÍøÂç½Ó¿ÚµÄʵÏÖ²¿·ÝÊǷdz£ÖµµÃÒ»¶ÁµÄ£¬Í¨¹ý¶ÁÔ´Â룬²»½ö¶ÔÍøÂçÐÒéÓиüÉîµÄÁ˽⣬ҲÓÐÖúÓÚÔÚÍøÂç±à³ÌµÄʱºò£¬¶ÔÓ¦Óú¯ÊýÓиü¾«È·µÄÁ˽âºÍ°ÑÎÕ¡£
¡¡¡¡±¾ÎÄ°ÑÖصã·ÅÔÚÍøÂç½Ó¿Ú³ÌÐòµÄ×ÜÌå½á¹¹ÉÏ£¬Ï£ÍûÄÜ×÷Ϊ¶ÁÔ´ÂëʱһЩָµ¼ÐÔµÄÎÄ×Ö¡£
¡¡¡¡±¾ÎÄÒÔLinux2.4.16ÄÚºË×÷Ϊ½²½âµÄ¶ÔÏó£¬ÄÚºËÔ´Âë¿ÉÒÔÔÚwww.kernel.orgÉÏÏÂÔØ¡£ÎÒ¶ÁÔ´Âëʱ²Î¿¼µÄÊÇ[lxr.linux.no]Õâ¸ö½»²î²Î¿¼µÄÍøÕ¾£¬ÎÒ¸öÈËÈÏΪÊÇÒ»¸öºÜºÃµÄ¹¤¾ß£¬Èç¹ûÓÐÌõ¼þ×îºÃÉÏÕâ¸öÍøÕ¾¡£
¡¡¡¡¶þ.ÍøÂç½Ó¿Ú³ÌÐòµÄ½á¹¹
¡¡¡¡LinuxµÄÍøÂç½Ó¿Ú·ÖΪËIJ¿·Ý£ºÍøÂçÉ豸½Ó¿Ú²¿·Ý£¬ÍøÂç½Ó¿ÚºËÐIJ¿·Ý£¬ÍøÂçÐÒé×岿·Ý£¬ÒÔ¼°ÍøÂç½Ó¿Úsocket²ã¡£
¡¡¡¡ÍøÂçÉ豸½Ó¿Ú²¿·ÝÖ÷Òª¸ºÔð´ÓÎïÀí½éÖʽÓÊպͷ¢ËÍÊý¾Ý¡£ÊµÏÖµÄÎļþÔÚlinu/driver/netĿ¼ÏÂÃæ¡£ÍøÂç½Ó¿ÚºËÐIJ¿·ÝÊÇÕû¸öÍøÂç½Ó¿ÚµÄ¹Ø¼ü²¿Î»£¬ËüΪÍøÂçÐÒéÌṩͳһµÄ·¢Ëͽӿڣ¬ÆÁ±Î¸÷ÖÖ¸÷ÑùµÄÎïÀí½éÖÊ£¬Í¬Ê±ÓÖ¸ºÔð°ÑÀ´×ÔϲãµÄ°üÏòºÏÊʵÄÐÒéÅäËÍ¡£ËüÊÇÍøÂç½Ó¿ÚµÄÖÐÊಿ·Ý¡£ËüµÄÖ÷ҪʵÏÖÎļþÔÚlinux/net/coreĿ¼Ï£¬ÆäÖÐlinux/net/core/dev.cΪÖ÷Òª¹ÜÀíÎļþ¡£
¡¡¡¡ÍøÂçÐÒé×岿·ÝÊǸ÷ÖÖ¾ßÌåÐÒéʵÏֵIJ¿·Ý¡£LinuxÖ§³ÖTCP/IP£¬IPX£¬X.25£¬AppleTalkµÈµÄÐÒ飬¸÷ÖÖ¾ßÌåÐÒéʵÏÖµÄÔ´ÂëÔÚlinux/net/Ŀ¼ÏÂÏàÓ¦µÄÃû³Æ¡£ÔÚÕâÀïÖ÷ÒªÌÖÂÛTCP/IP(IPv4)ÐÒ飬ʵÏÖµÄÔ´ÂëÔÚlinux/net/ipv4,ÆäÖÐlinux/net/ipv4/af_inet.cÊÇÖ÷ÒªµÄ¹ÜÀíÎļþ¡£
¡¡¡¡ÍøÂç½Ó¿ÚSocket²ãΪÓû§ÌṩµÄÍøÂç·þÎñµÄ±à³Ì½Ó¿Ú¡£Ö÷ÒªµÄÔ´ÂëÔÚlinux/net/socket.c¡£
¡¡¡¡Èý.ÍøÂçÉ豸½Ó¿Ú²¿·Ý
¡¡¡¡ÎïÀí²ãÉÏÓÐÐí¶à²»Í¬ÀàÐ͵ÄÍøÂç½Ó¿ÚÉ豸, ÔÚÎļþinclude/linux/if_arp.hµÄ28ÐÐÀﶨÒåÁËARPÄÜ´¦ÀíµÄ¸÷ÖÖÎïÀíÉ豸µÄ±êÖ¾·û¡£ÍøÂçÉ豸½Ó¿ÚÒª¸ºÔð¾ßÌåÎïÀí½éÖʵĿØÖÆ£¬´ÓÎïÀí½éÖʽÓÊÕÒÔ¼°·¢ËÍÊý¾Ý£¬²¢¶ÔÎïÀí½éÖʽøÐÐÖîÈç×î´óÊý¾Ý°üÖ®ÀàµÄ¸÷ÖÖÉèÖá£ÕâÀïÎÒÃÇÒԱȽϼòµ¥µÄ3Com3c501ÒÔÌ«Íø¿¨µÄÇý¶¯³ÌÐòΪÀý£¬´ó¸Å½²Ò»ÏÂÕâ²ãµÄ¹¤×÷ÔÀí¡£Ô´ÂëÔÚLinux/drivers/net/3c501.c¡£
¡¡¡¡ÎÒÃÇ´ÓÖ±¾õÉÏÀ´¿¼ÂÇ£¬Ò»¸öÍø¿¨µ±È»×îÖ÷ÒªµÄÊÇÍê³ÉÊý¾ÝµÄ½ÓÊպͷ¢ËÍ£¬ÔÚÕâÀïÎÒÃÇÀ´¿´¿´½ÓÊպͷ¢Ë͵Ĺý³ÌÊÇÔõôÑùµÄ¡£
¡¡¡¡·¢ËÍÏà¶ÔÀ´Ëµ±È½Ï¼òµ¥£¬ÔÚLinux/drivers/net/3c501.cµÄ475ÐпªÊ¼µÄel_start_xmit()Õâ¸öº¯Êý¾ÍÊÇʵ¼ÊÏò3Com3c501ÒÔÌ«Íø¿¨·¢ËÍÊý¾ÝµÄº¯Êý£¬¾ßÌåµÄ·¢Ë͹¤×÷²»ÍâºõÊǶÔһЩ¼Ä´æÆ÷µÄ¶Áд£¬Ô´ÂëµÄ×¢ÊͺÜÇå³þ£¬´ó¼Ò¿ÉÒÔ¿´¿´¡£
¡¡¡¡½ÓÊյŤ×÷Ïà¶ÔÀ´Ëµ±È½Ï¸´ÔÓ¡£Í¨³£À´Ëµ£¬Ò»¸öеİüµ½ÁË£¬»òÕßÒ»¸ö°ü·¢ËÍÍê³ÉÁË£¬¶¼»á²úÉúÒ»¸öÖжϡ£ÔÚLinux/drivers/net/3c501.cÖеÄ572ÐУ¬¿ªÊ¼µÄel_interrupt()º¯ÊýÀïÃ棬ǰ°ë²¿·Ý´¦ÀíµÄÊÇ·¢ËÍÍê°üÒÔºóµÄ»ã±¨£¬ºó°ë²¿·Ý´¦ÀíµÄÊÇÒ»¸öÐÂÀ´µÄ°ü£¬¾ÍÊÇ˵½ÓÊÕµ½ÁËеÄÊý¾Ý¡£el_interrupt()º¯Êý²¢Ã»ÓжÔеİü½øÐÐÌ«¶àµÄ´¦Àí£¬¾Í½»¸øÁ˽ÓÊÕ´¦Àíº¯Êýel_receive()¡£el_receive()Ê×Ïȼì²é½ÓÊյİüÊÇ·ñÕýÈ·£¬Èç¹ûÊÇÒ»¸ö¡°ºÃ¡±°ü¾Í»áΪ°ü·ÖÅäÒ»¸ö»º³å½á¹¹(dev_alloc_skb())£¬ÕâÑùÇý¶¯³ÌÐò¶Ô°üµÄ½ÓÊÕ¹¤×÷¾ÍÍê³ÉÁË£¬Í¨¹ýµ÷ÓÃÉϲãµÄº¯Êýnetif_rx()(net/core/dev.c1214ÐÐ) £¬°Ñ°ü½»¸øÉϲ㡣
¡¡¡¡ÏÖÔÚÇý¶¯³ÌÐòÓÐÁË·¢ËͺͽÓÊÕÊý¾ÝµÄ¹¦ÄÜÁË£¬Çý¶¯³ÌÐòÔõôÑùºÍÉϲ㽨Á¢ÁªÏµÄØ£¿¾ÍÊÇ˵½ÓÊÕµ½°üÒÔºóÔõôË͸øÉϲ㣬ÒÔ¼°ÉϲãÔõôÄܵ÷ÓÃÇý¶¯³ÌÐòµÄ·¢Ëͺ¯ÊýÄØ£¿
vankinger ÓÚ 2006-09-18 11:48:03·¢±í:
¶¥
supop ÓÚ 2006-09-18 10:37:35·¢±í:
¡¡¡¡ÓÉÏÂÍùÉϵĹØϵ£¬ÊÇͨ¹ýÇý¶¯³ÌÐòµ÷ÓÃÉϲãµÄnetif_rx()(net/core/dev.c 1214ÐÐ)º¯ÊýʵÏֵģ¬Çý¶¯³ÌÐòͨ¹ýÕâ¸öº¯Êý°Ñ½Óµ½µÄÊý¾Ý½»¸øÉϲ㣬Çë×¢ÒâËùÓеÄÍø¿¨Çý¶¯³ÌÐò¶¼ÐèÒªµ÷ÓÃÕâ¸öº¯ÊýµÄ£¬ÕâÊÇÍøÂç½Ó¿ÚºËÐIJãºÍÍøÂç½Ó¿ÚÉ豸ÁªÏµµÄÇÅÁº¡£
¡¡¡¡ÓÉÉÏÍùϵĹØϵ¾Í¸´Ôӵ㡣ÍøÂç½Ó¿ÚºËÐIJãÐèÒªÖªµÀÓжàÉÙÍøÂçÉ豸¿ÉÒÔÓã¬Ã¿¸öÉ豸µÄº¯ÊýµÄÈë¿ÚµØÖ·µÈ¶¼ÒªÖªµÀ¡£ÍøÂç½Ó¿ÚºËÐIJã»á´óÉùº°£¬¡°ºÙ£¬ÓжàÉÙÉ豸¿ÉÒÔ°ïÎÒ·¢ËÍÊý¾Ý°ü£¿ÄÜ·¢Ë͵ģ¬Çë¸øÎÒÅųÉÒ»¶Ó£¡¡±¡£ÕâÒ»¶Ó¾ÍÓÉdev_base¿ªÊ¼£¬Ö¸Õëstructnet_device *dev_base(Linux/include/linux/netdevice.h 436ÐÐ)¾ÍÊDZ£´æÁËÍøÂç½Ó¿ÚºËÐIJãËùÖªµÀµÄËùÓÐÉ豸¡£¶ÔÓÚÍøÂç½Ó¿ÚºËÐIJãÀ´Ëµ£¬ËùÓеÄÉ豸¶¼ÊÇÒ»¸önet_device½á¹¹£¬ËüÔÚinclude/linux/netdevice.h,line 233Àï±»¶¨Ò壬ÕâÊÇ´ÓÍøÂç½Ó¿ÚºËÐIJãµÄ½Ç¶È¿´µ½µÄÒ»¸ö³éÏóµÄÉ豸£¬ÎÒÃÇÀ´¿´¿´ÍøÂç½Ó¿ÚºËÐIJãµÄ½Ç¶È¿´µ½µÄÍøÂçÉ豸¾ßÓеŦÄÜ£º
[code]struct net_device {
¡¡¡¡¡¡¡
¡¡¡¡open()
¡¡¡¡stop()
¡¡¡¡hard_start_xmit() £¯* ÈÃϲ㷢Êý¾Ý°ü */
¡¡¡¡hard_header()
¡¡¡¡rebuild_header()
¡¡¡¡set_mac_address()
¡¡¡¡do_ioctl()
¡¡¡¡set_config()
¡¡¡¡hard_header_cache()
¡¡¡¡header_cache_update()
¡¡¡¡change_mtu()
¡¡¡¡tx_timeout()
¡¡¡¡hard_header_parse()
¡¡¡¡neigh_setup()
¡¡¡¡accept_fastpath()
¡¡¡¡¡¡¡
¡¡¡¡}[/code]
¡¡¡¡Èç¹ûÍøÂç½Ó¿ÚºËÐIJãÐèÒªÓÉϲ㷢ËÍÊý¾ÝµÄʱºò£¬ÔÚdev_baseÕÒµ½É豸ÒԺ󣬾ÍÖ±½Óµ÷dev->hard_start_xmit()µÄÕâ¸öº¯ÊýÀ´ÈÃϲ㷢Êý¾Ý°ü¡£
¡¡¡¡Çý¶¯³ÌÐòÒªÈÃÍøÂç½Ó¿ÚºËÐIJãÖªµÀ×Ô¼ºµÄ´æÔÚ£¬µ±È»Òª¼ÓÈëdev_baseËùÖ¸ÏòµÄÖ¸ÕëÁ´£¬È»ºó°Ñ×Ô¼ºµÄº¯ÊýÒÔ¼°¸÷ÖÖ²ÎÊýºÍnet_deviceÀïµÄÏàÓ¦µÄÓò¶ÔÓ¦ÆðÀ´¡£¼ÓÈëdev_baseËùÖ¸ÏòµÄÖ¸ÕëÁ´ÊÇͨ¹ýº¯Êýregister_netdev(&dev_3c50)(linux/drivers/net/net_init.c, line 532)½¨Á¢µÄ¡£¶ø°Ñ×Ô¼ºµÄº¯ÊýÒÔºÍnet_deviceÀïµÄÏàÓ¦µÄÓò¼°¸÷ÖÖ²ÎÊý¹ØϵµÄ½¨Á¢ÊÇÔÚel1_probe1()(Linux/drivers/net/3c501.c)Àï½øÐеģº
[code]el1_probe1(){
¡¡¡¡¡¡¡
¡¡¡¡dev->open = &el_open;
¡¡¡¡dev->hard_start_xmit = &el_start_xmit; /* ÏÂÃæ×¢½âµÄ£¬¾ÍÊÇ´ËÓï¾ä */
¡¡¡¡dev->tx_timeout = &el_timeout;
¡¡¡¡dev->watchdog_timeo = HZ;
¡¡¡¡dev->stop = &el1_close;
¡¡¡¡dev->get_stats = &el1_get_stats;
¡¡¡¡dev->set_multicast_list = &set_multicast_list;
¡¡¡¡¡¡¡
¡¡¡¡ether_setup(dev);
¡¡¡¡¡¡¡
¡¡¡¡}[/code]
¡¡¡¡½øÒ»²½µÄ¶ÔÓ¦¹¤×÷ÔÚether_setup(dev) (drivers/net/net_init.c, line 405 )Àï½øÐС£ÎÒÃÇ×¢Òâµ½dev->hard_start_xmit =&el_start_xmit£¬ÕâÑù·¢Ëͺ¯ÊýµÄ¹Øϵ¾Í½¨Á¢ÁË£¬ÉϲãÖ»ÖªµÀµ÷ÓÃdev->hard_start_xmitÕâ¸öÀ´·¢ËÍÊý¾Ý£¬ÉÏÃæµÄÓï¾ä¾Í°ÑÇý¶¯³ÌÐòʵ¼ÊµÄ·¢Ëͺ¯Êý¸æËßÁËÉϲ㡣