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

LinuxÄÚºË2.4.xµÄÍøÂç½Ó¿Ú½á¹¹(Ò»)

·¢²¼Ê±¼ä:2006-09-18 10:36:40À´Ô´:ºìÁª×÷Õß:supop
¡¡¡¡Ò».Ç°ÑÔ

¡¡¡¡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ÐÐ) £¬°Ñ°ü½»¸øÉϲ㡣

¡¡¡¡ÏÖÔÚÇý¶¯³ÌÐòÓÐÁË·¢ËͺͽÓÊÕÊý¾ÝµÄ¹¦ÄÜÁË£¬Çý¶¯³ÌÐòÔõôÑùºÍÉϲ㽨Á¢ÁªÏµÄØ£¿¾ÍÊÇ˵½ÓÊÕµ½°üÒÔºóÔõôË͸øÉϲ㣬ÒÔ¼°ÉϲãÔõôÄܵ÷ÓÃÇý¶¯³ÌÐòµÄ·¢Ëͺ¯ÊýÄØ£¿
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 2 ÌõÆÀÂÛ

  1. vankinger ÓÚ 2006-09-18 11:48:03·¢±í:

    ¶¥

  2. 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Õâ¸öÀ´·¢ËÍÊý¾Ý£¬ÉÏÃæµÄÓï¾ä¾Í°ÑÇý¶¯³ÌÐòʵ¼ÊµÄ·¢Ëͺ¯Êý¸æËßÁËÉϲ㡣