OG¶«·½ÌüADLab£º£º£ºLinuxÄÚºËCVE-2017-11176·ì϶·ÖÎöÓ븴ÏÖ

°ä²¼¹¦·ò 2019-01-04
·ì϶²¼¾°

LinuxÄÚºËÖеÄPOSIX ÐÂÎŶÓÁÐʵÏÖÖдæÔÚÒ»¸öUAF·ì϶CVE-2017-11176¡£¡£¹¥»÷ÕßÄܹ»ÀûÓø÷ì϶µ¼Ö»ؾø·þÎñ»òÖ´ÐÐËÁÒâ´úÂë¡£¡£±¾ÎĽ«´Ó·ì϶³ÉÒò¡¢¡¢²¹¶¡·ÖÎöÒÔ¼°·ì϶¸´Ïֵȶà¸ö½Ç¶È¶Ô¸Ã·ì϶½øÐоßÌå·ÖÎö¡£¡£

·ì϶·ÖÎö


PosixÐÂÎŶÓÁÐÔÊÐíÒì²½ÊÂÎñ֪ͨ£¬£¬µ±ÍùÒ»¸ö¿Õ¶ÓÁиéÖÃÒ»¸öÐÂÎÅʱ£¬£¬PosixÐÂÎŶÓÁÐÔÊÐí²úÉúÒ»¸öÐźŻòÆô¶¯Ò»¸öÏ̡߳£¡£ÕâÖÖÒì²½ÊÂÎñ֪ͨŲÓÃmq_notifyº¯ÊýʵÏÖ£¬£¬mq_notifyΪָ¶¨¶ÓÁгÉÁ¢»òɾ³ýÒ첽֪ͨ¡£¡£ÓÉÓÚmq_notifyº¯ÊýÔÚ½øÈëretryÁ÷³ÌʱûÓн«sockÖ¸ÕëÉèÖÃΪNULL£¬£¬¿ÉÄܵ¼ÖÂUAF·ì϶¡£¡£


´Ó²¹¶¡´úÂë¿ÉÖª£¬£¬½«sockÉèÖÃΪNULL¼´¿É¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


½ÓÏÂÀ´¿´¿´·ì϶ÆðÒò£¬£¬ÕâÀïÒÔ4.1.0°æ±¾Ô­ÂëΪÀý¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÔÚmq_notifyº¯ÊýÖУ¬£¬ u_notificationÊÇ´ÓÓû§²ã´«½øÀ´µÄ£¬£¬1193ÐÐÅжÏu_notificationÊÇ·ñΪ¿Õ£¬£¬ÈôÊǷǿգ¬£¬Í¨¹ýcopy_from_user½«u_notificationÖеÄÊý¾Ý¿½±´µ½notificationÖУ¬£¬ÕâÀォÊý¾Ý´ÓÓû§²ã¿½±´µ½ÁËÄں˲ã¡£¡£ÈôÊÇ¿½±´Ê§°Ü£¬£¬Ö±½ÓÍ˳ö¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


½ÓÏÂÀ´£¬£¬ncºÍsock±ðÀëÖÿÕ¡£¡£ÐÐ1203£¬£¬ÈôÊÇu_notification²»Îª¿Õ£¬£¬Ê×ÏÈ˳´ÎÅжÏnotification.sigev_notify±ØÐëΪSIGEV_NONE»òSIGEV_SIGNAL»òSIGEV_THREAD¡£¡£ÈôÊÇnotification.sigev_notifyΪSIGEV_SIGNAL£¬£¬¾ÍÅжϸÃÐźÅÊÇ·ñºÏ·¨¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ1212£¬£¬ÈôÊÇnotification.sigev_notifyΪSIGEV_THREAD£¬£¬½øÈë¹Ø¼ü´úÂë¿é¡£¡£ÐÐ1216£¬£¬Í¨¹ýalloc_skb´´½¨Ò»¸önotify_skb£¬£¬ÓÃÓÚ½Ó¹ÜÊý¾Ý¡£¡£ÐÐ1221£¬£¬Í¨¹ýcopy_from_user½«notification.sigev_value.sival_ptrÖ¸ÏòµÄÊý¾Ý¿½±´µ½nc->dataÖС£¡£ÕâÀï±ØÐë³É¹¦£¬£¬²»È»Ö±½ÓÍ˳ö£»£»ÐÐ1229£¬£¬Å²ÓÃskb_putÉèÖÃÐÂÎÅÊý¾ÝÍ·²¿¡£¡£ÐÐ1231µ½ÐÐ1248ÊÇretryÑ­»·Ìå¡£¡£ÐÐ1232£¬£¬Å²ÓÃfdgetº¯Êý»ñÈ¡ÎļþÃèÊö·û¡£¡£ÐÐ1237£¬£¬Å²ÓÃnetlink_getsockbyfilpº¯Êýͨ¹ýÎļþÃèÊö·û»ñÈ¡netlink_sock£¬£¬¾ßÌå¿´Ò»ÏÂnetlink_getsockbyfilpº¯Êý¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ŲÓÃfile_inodeͨ¹ýfilpÕÒµ½¶ÔÓ¦µÄinode½Úµã£¬£¬¶øºóͨ¹ýSOCK_Iº¯Êý´¦ÖÃinode½Úµã¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÕâÀïͨ¹ýºêcontainer_ofÔÚsocket_alloc½á¹¹ÌåÖÐÕÒ³ösocket³ÉÔ±¡£¡£ÕâÀïÚ¹ÊÍһϣ¬£¬SOCKET_I·µ»ØÖµÊÇsocket½á¹¹Ìå¡£¡£Æäʵsock½á¹¹ÌåÖеÚÒ»¸ö³ÉÔ±sock_commonÒ²ÊÇsocketÀàÐÍ£¬£¬ÊÇÒ»¸öÃÔÄã°æsocket¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÏÂÃæ¿´Ò»ÏÂsock_common½á¹¹Ìå¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ1609£¬£¬»ñÈ¡µ½sockºó£¬£¬¶øºóÅжÏsock->sk_familyÊÇ·ñµÈÓÚAF_NETLINK¡£¡£ÐÐ1613£¬£¬½Ó×ÅŲÓÃsock_holdÔö³¤ÒýÓüÆÊý¡£¡£sock_holdº¯ÊýÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ÕâÀïatomic_inc½øÐÐsk_refcnt¼Ó1¡£¡£netlink_getsockbyfilpº¯Êý·µ»Øsock£¬£¬ÕâʱsockµÄÒýÓüÆÊý¼Ó1¡£¡£½ÓÏÂÀ´£¬£¬ÐÐ1246£¬£¬Å²ÓÃnetlink_attachskb¡£¡£ÕâÊǸö¹Ø¼üº¯Êý£¬£¬¸Ãº¯ÊýÖ°ÄÜÊǽ«skb°ó¶¨µ½netlink socketÉÏ£¬£¬¾ßÌ幨¼ü´úÂëÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ1683£¬£¬Å²ÓÃsock_putÏ÷¼õÒýÓüÆÊýÒ»´Î£¬£¬×îºóreturn 1£¬£¬º¯Êý·µ»Ø£¬£¬Ö±½Ógotoµ½retry±êÇ©´¦Ëù¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÕâÀïÐÐ1237ºÍÐÐ1246£¬£¬ÕâÁ½´¦Å²ÓÃÕýºÃ½øÐÐÁËÒýÓüÆÊýµÖÏû¡£¡£ÐÐ1247µÄifÓï¾äÖв¢Ã»Óн«sockÖÿÕ£¬£¬ÔÙ¿´ÐÐ1233£¬£¬ÈôÊÇf.fileΪ¿Õ£¬£¬ÄǾÍÖ±½Ógotoµ½out±êÇ©¡£¡£out±êÇ©´úÂëÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ1306£¬£¬ÅжÏsockÊÇ·ñΪ¿Õ£¬£¬ÈôÊDz»Îª¿Õ£¬£¬Å²ÓÃnetlink_detachskbº¯Êý¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


¿ªÊÍskb£¬£¬²¢Ï÷¼õskÒýÓüÆÊý£¬£¬½øÐпªÊÍ¡£¡£ ÄÇô¾ÍÓÐÎÊÌâÁË£¬£¬ÈôÊÇÎÒÃÇ´´½¨AÏß³Ìά³Önetlink_attachskb·µ»Ø1£¬£¬²¢·´¸´retryÂß¼­£¬£¬Õâ¸öʱ³½sockµÄÒýÓüÆÊýÊÇά³ÖƽºâµÄ£¬£¬Ò»¼ÓÒ»¼õ£¬£¬µ«ÊÇsock²¢²»ÊÇΪ¿Õ¡£¡£Í¬Ê±ÔÙ´´½¨BÏß³ÌÈ¥¹Ø±Õnetlink socket¶ÔÓ¦µÄÎļþÃèÊö·û¡£¡£ÓÉÓÚBÏ̹߳رÕÁËnetlink socketµÄÎļþÃèÊö·û£¬£¬ÄÇAÏß³ÌÔÚretryÂß¼­ÖУ¬£¬ÐÐ1232£¬£¬Å²ÓÃfdgetʱ»áʧ°Ü£¬£¬¶øºóÖ±½Ógotoµ½out±êÇ©£¬£¬½øÐпªÊÍ£¬£¬½øÐÐÁ˶þ´Î¿ªÊÍ£¬£¬µ¼Ö·ì϶¡£¡£Õâ¸ö·ì϶ÊÇÊôÓÚǰÌᾺÕùÐ͵Ķþ´Î¿ªÊÍ·ì϶£¬£¬Ö»ÔÚÒ»¸öÏß³ÌÖУ¬£¬ÊÇÎÞ·¨´¥·¢·ì϶¡£¡£


Õâ¸ö·ì϶µÀÀí±ÈÁ¦µ¥Ò»£¬£¬µ«ÊÇÈôºÎ´¥·¢Õâ¸ö·ì϶»¹ÊDZÈÁ¦¸´ÔÓ¡£¡£Ê×ÏÈ£¬£¬ÈôºÎÈÃnetlink_attachskb·µ»Ø1£¬£¬´Ó¶øË³Àû½øÈëretryÂß¼­¡£¡£Ôٴλؿ´netlink_attachskbµÄʵÏÖ¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ1657£¬£¬Í¨¹ýnlk_skº¯Êýͨ¹ýsk»ñÈ¡netlink_sock¡£¡£ÕâÀïµÄnlk_skÈçÏ¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ͨ¹ýŲÓúêcontainer_of»ñÈ¡netlink_sock¡£¡£netlink_sock½á¹¹ÌåÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


netlink_sock½á¹¹ÌåµÚÒ»¸ö³ÉÔ±ÊÇsockÀàÐÍ£¬£¬¶øsock½á¹¹ÌåµÄµÚÒ»¸ö³ÉÔ±ÊÇsocket¡£¡£ÐÐ1660£¬£¬µÚÒ»¸öifÅжϱØÐëµÃ½øÈë¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


!netlink_skb_is_mmaped(skb)×¢¶¨·µ»Øtrue£¬£¬¹Ø¼üÊÇsk->sk_rmem_alloc>sk->sk_rcvbuf || test_bit(NETLINK_CONGESTED, &nlk->state)Á˾ֱØÐëÊÇtrue¡£¡£


ÕâÀïͨ¹ýÉèÖÃsk->sk_rmem_allocµÄ¾ÞÏ¸ÈÆ¹ýcheck¸üΪ·½±ã£¬£¬´úÂëÈçÏ¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


Èç¹ûifÅжϲ»Í¨¹ý£¬£¬½Ó×ÅŲÓÃnetlink_skb_set_owner_rº¯Êý£¬£¬ÈçÏÂËùʾ¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ878£¬£¬Å²Óúêatomic_add£¬£¬¸ÃºêÖ´ÐÐÔ­×Ó¼Ó²Ù×÷¡£¡£ÕâÐдúÂëµÄÔ¢ÒâÊÇ£º£º£ºÔÚsk->sk_rmem_allocµÄ»ù´¡ÉϼÓÉÏskb->truesize¡£¡£µÈͬÓÚsk->sk_rmem_alloc += skb->truesize¡£¡£¼ÈÈ»¸Ãº¯ÊýÀïÕâÐдúÂëÄܹ»Ö±½ÓÔö³¤sk->sk_rmem_allocµÄ¾Þϸ£¬£¬ÄÇô¿É²»³ÉÒÔÂÅ´ÎŲÓÃnetlink_skb_set_owner_rº¯ÊýÔö³¤sk->rmem_allocµÄÖµ£¿ÀíÂÛÉÏÊÇÆëÈ«Äܹ»µÄ£¬£¬¿´¿´ÈôºÎ´ÓÓû§²ã´ïµ½Õâ¸öº¯Êý¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ͨ¹ýunderstand¹¤¾ßÄܹ»¼±¾çÕÒµ½netlink_skb_set_owner_rµÄŲÓÃÁ´£º£º£ºnetlink_sendmsg->netlink_unicast->netlink_attachskb->netlink_skb_set_owner_r¡£¡£


ÈôºÎ˳ÀûµÄͨ¹ýº¯ÊýŲÓÃõè¾¶£¿ÕâÀï±ØÒª·ÖÎöÈôºÎ´Ónetlink_sendmsg´ïµ½netlink_skb_set_owner_r¡£¡£netlink_sendmsgº¯ÊýʵÏÖÈçÏ¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ2285£¬£¬Ê×ÏÈÅжÏmsg->msg_flag²»ÄÜΪMSG_OOB£¬£¬³ÖÐøÍùÏ¿´¡£¡£

OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ2292£¬£¬ÅжÏmsg->msg_namelenµÄ³¤¶È£¬£¬ÕâÀï±ØÐ벻Ϊ¿Õ£¬£¬µ±È»Ò²²»»áΪ¿Õ¡£¡£½øÈëifºó£¬£¬ÅжÏaddr->nl_familyÊÇ·ñµÈÓÚAF_NETLINK¡£¡£ÐÐ2299£¬£¬ÅжÏdst_group»òdst_portid²»Îª¿Õ£¬£¬dst_group°µÊ¾¶à²¥Ä£Ê½£¬£¬dst_portidÀ´×ÔÓÚaddr->nl_pid£¬£¬Òò¶ø±£ÕÏdst_portid²»Îª¿Õ±ÈÁ¦ÈÝÒס£¡£½ÓÏÂÀ´£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ2320£¬£¬ÅжÏÁËmsg->msg_iter.iov->iov_base²»ÄÜΪ¿Õ¡£¡£²¢ÇÒlen²»³ÉÒÔ´óÓÚsk->sk_sndbuf-32¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÆäʵÕû¸öº¯ÊýÖУ¬£¬Óû§²ã¿É¿ØµÄÖ»ÓÐÕâô¶à¡£¡£Ö±½Ó¿´netlink_unicastµÄŲÓᣡ£


OG¶«·½Ìü¡¤(Öйú´ó½)


netlink_unicastº¯ÊýʵÏÖÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


Õû¸öº¯ÊýÖУ¬£¬Óû§ÄܽÚÖÆµÄ²»¶à¡£¡£ÐÐ1783£¬£¬ÉèÖÃÁËtimeo£¬£¬ÕâÀïÒª±£ÕÏnonblockΪmsg->msg_flags&MSG_DONTWAIT£¬£¬ÕâÑùÏ̲߳Ų»»á±»block¡£¡£ÐÐ1790£¬£¬ÅжÏskÊÇ·ñΪÄں˰æµÄsk£¬£¬ÔÚÓû§²ã´´½¨socketʱӦʹÓÃNETLINK_USERSOCK¡£¡£ÐÐ1793£¬£¬ÅжÏÊÇ·ñÓÐsk_filter£¬£¬ÕâÀï±£Õϲ»½øÈë¸ÃifÓï¾ä£¬£¬²»ÒªÉèÖùýÂËÆ÷¡£¡£ÐÐ1800£¬£¬Ö±½ÓŲÓÃnetlink_attachskb£¬£¬³É¹¦´ïµ½netlink_skb_set_owner_rº¯Êý¡£¡£ÕâËãÊÇͨ¹ýŲÓÃnetlink_sendmsgÀ´Ôö³¤sk->sk_rmem_allocµÄ¹ý³Ì¡£¡£ÆäʵÎÒÃDz»µ«Äܹ»Ôö³¤sk->sk_rmem_alloc£¬£¬»¹Äܹ»¼õСsk->sk_rcvbuf¡£¡£


ÄÇôÈôºÎ¼õСsk->sk_rcvbuf£¿ÔÚsetsockoptº¯ÊýÖУ¬£¬ÕÒµ½sock_setsockoptº¯ÊýÖжÔsk->sk_rcvbufµÄ²Ù×÷¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ773£¬£¬sk->sk_rcvbufÈ¡val*2ºÍSOCK_MIN_RCVBUFÖ®¼äµÄ×î´óÖµ¡£¡£ÐÐ755£¬£¬valÈ¡valºÍsysctl_rmem_maxÖ®¼äµÄ×îСֵ¡£¡£ÐÐ749£¬£¬Õâ¸öcaseΪSO_RCVBUF¡£¡£³ÖÐøÍùÉÏ¿´¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ693£¬£¬Òª±£ÕÏoptlen²»Ð¡ÓÚsizeof(int)¡£¡£ÐÐ696£¬£¬½«optval¸³Öµµ½valÖУ¬£¬ÕâÀïoptvalÊÇÓû§¿É¿ØµÄ¡£¡£ÐÐ703£¬£¬switch·Ö·¢optname£¬£¬ËùÒÔÒª±£ÕÏoptnameΪSO_RCVBUF¡£¡£ÕâÑù¾ÍÄܹ»±£ÕÏ˳Àû´ïµ½Åú¸Äsk->rcvbufµÄ´úÂë´¦¡£¡£

µ½ÕâÀ£¬ÎÒÃÇͨ¹ýÁ½ÖÖ·½Ê½½øÐÐÈÆ¹ýnetlink_attachskbº¯ÊýÖеĵÚÒ»¸öcheck¡£¡£


£¨1£©Í¨¹ýnetlink_sendmsgÔö³¤sk->sk_rmem_allocµÄÖµ.

£¨2£©Í¨¹ýsock_setsockopt¾¡¿ÉÄܵؼõСsk->rcvbufµÄÖµ¡£¡£


½øÈëifÓï¾äºó£¬£¬¿´ÈçÏ´úÂ룺£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


Õâ¶Î´úÂë»áÈõ±Ç°Áг̽øÈëÆÚ´ý״̬£¬£¬Ö±½Óblock¡£¡£ÈôÊDz»Ïë½øÈëÆÚ´ý״̬£¬£¬Ö»ÓÐÉèÖÃsock_flagΪSOCK_DEAD¡£¡£µ«ÊÇÈôÊǰÑsock_flagÉèÖóÉSOCK_DEAD£¬£¬ÄǺóÃæÒ²Ã»ÓбØÒª½øÐУ¬£¬Òò¶øÕâÀïÊDZØÈ»Òª½øÈëÆÚ´ý״̬µÄ¡£¡£Ò»ÖÖÆæÃîµÄ²½ÖèÊÇÖ±½ÓŲÓÃwake_up_interruptibleÇ¿Ðл½ÐÑÏ̡߳£¡£ÄÇÈôºÎŲÓÃwake_up_interruptibleÄØ£¿º¯ÊýŲÓÃÁ´¼«¶È¼ò¶Ì£º£º£ºnetlink_setsockopt->wake_up_interruptible¡£¡£


ÔÚNetlink_setsockoptº¯ÊýÖУº£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ2182£¬£¬Å²ÓÃwake_up_interruptible»½ÐÑÏ̡߳£¡£ÐÐ2178£¬£¬caseΪNETLINK_NO_ENOBUFS¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ2131£¬£¬ÅжÏlevel±ØÐëΪSOL_NETLINK£¬£¬ÐÐ2134£¬£¬ÅжÏoptname²»ÄÜΪNETLINK_RX_RINGºÍNETLINK_TX_RING£¬£¬Í¬Ê±±£ÕÏoptlen´óÓÚµÈÓÚsizeof(int)¡£¡£ÐÐ2139£¬£¬switch·Ö·¢optname£¬£¬ÕâÀïÒª±£ÕÏoptnameΪNETLINK_NO_ENOBUFS¡£¡£µ½ÕâÀ£¬¸ù»ùÉϾÍÄܹ»±£ÕÏnetlink_attachskb·µ»Ø1¡£¡£


±£ÕϽøÈëretryÑ­»·ºó£¬£¬Õâ¸öʱ³½sockÒѾ­²»Îª¿Õ¡£¡£½ÓÏÂÀ´ÒªÊ¹retryÑ­»·Öз¸´í£¬£¬Ö±½ÓÌø×ªµ½out£¬£¬´úÂëÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ÐÐ1232£¬£¬Í¨¹ýfdget»ñÈ¡notification.sigev_signoµÄfd¡£¡£Notification.sigev_signoÊÇÓû§Ì¬´«½øÀ´µÄ£¬£¬Òò¶øÆëÈ«Äܹ»ÔÚÓû§²ãÖ±½ÓcloseÕâ¸ösocket¡£¡£ÔÚÓû§²ãcloseÕâ¸ösocketºó£¬£¬ÐÐ1233£¬£¬½øÈëifÂß¼­£¬£¬¶øºóÌøµ½out±êÇ©¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


Õâ¸öʱ³½sock³¤¶Ì¿ÕµÄ£¬£¬ifÅжÏÎªÕæ£¬£¬½øÈënetlink_destachskb£¬£¬½ÓמÍÊÇfree±ÀÀ£¡£¡£


·ì϶¸´ÏÖ


¶ÔÓÚUAFÀàÐ͵ķì϶£¬£¬Í¨Óò½Öè¾ÍÊÇʹÓöÑÅçÉäռλ¡£¡£±¾´Î·ì϶Öб»ÂŴοªÊ͵ĶÔÏóÊÇnetlink_sock¶ÔÏ󡣡£netlink_sock¶ÔÏó¾ÞϸΪ0x3f0×Ö½Ú£¬£¬¼´ÊÇ1008byte¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ƾ¾ÝÄÚ²é¶ÔÏóÄÚ´æ·ÖÅ乿¶¨£¬£¬ netlink_sock¶ÔÏóÓ¦¸Ã´Ókmalloc-1024Õâ¸ö»º´æÖнøÐзÖÅä¡£¡£
slab·ÖÅäÆ÷ÔÚ·ÖÅä¶ÔÏóʱ£¬£¬×ñÊØºó½øÏȳöµÄ¹æ¶¨¡£¡£ÏÂÃæÊÇslab·ÖÅäÆ÷¿ªÊͶÔÏóµÄ¹ý³Ì¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


Òª¿ªÊ͵ĶÔÏóobjp·ÅÔÚÁËac->entry[]µÄ½áβ¡£¡£ÏÂÃæÊÇslab·ÖÅäÆ÷·ÖÅä¶ÔÏóµÄ¹ý³Ì£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


·ÖÅä¶ÔÏóÖ±½Ó´Óac->entry[]½áβµ¯³öÒ»¸ö¶ÔÏ󡣡£


ËùÒÔÒ»¸ö¸Õ¸Õ±»¿ªÊ͵ĶÔÏóÊÇÅÅÔÚÁ´±íÄ©¶Î£¬£¬ÈôÊÇ´Ëʱ¸ÕºÃÔÚͳһ»º´æÖнøÐжÔÏó·ÖÅ䣬£¬ÄǸոտªÊ͵ĶÔÏó¾Í»á±»ÖØÐ·ÖÅä³öÈ¥£¬£¬Õâ¾Í³öÏÖÁ½¸öÖ¸ÕëÖ¸Ïòͳһ¿éÄÚ´æµØÖ·¡£¡£ÒªÏë±£ÕÏÉêÇëµÄÄÚ´æÕýºÃÂäÔÚ·ì϶¶ÔÏóµÄÄÚ´æµØÎ»ÖУ¬£¬±ØÒª°ÑÎÕס¼¸µã£º£º£º


¶ÑÅç¶ÔÏóʹÓõÄÄں˻º´æÓ¦¸ÃºÍ·ì϶¶ÔÏóÄÚ´æÔÚͳһ¸ö»º´æÖС£¡£¼´¾Þϸ±ØÐëÂäÔÚͳһ¸ökmalloc-XÖС£¡£


ac×ÔÉíÊÇarray_chche½á¹¹Ì壬£¬¸Ã½á¹¹ÌåÊDZ¾µØ¸ßËÙ»º´æ£¬£¬Ã¿¸öCPU¶ÔÓ¦Ò»¸ö£¬£¬ËùÒÔ»¹Òª±£Õ϶ÑÅçÉêÇëµÄ¶ÔÏóºÍ·ì϶¶ÔÏóÔÚͳһ¸öCPU±¾µØ¸ßËÙ»º´æÖС£¡£


ÈôÊǶÑÅçÉêÇëµÄ¶ÔÏóÖ»ÊǶÌÔÝפÁô£¬£¬µ±¸Ãº¯Êý·µ»ØÊ±½«ÉêÇëµÄ¶ÔÏó½øÐÐÁË¿ªÊÍ£¬£¬µ¼ÖÂÎÞ·¨Õýȷռλ¡£¡£ËùÒÔÒªÄܱ£ÕÏÉêÇëµÄ¶ÔÏó²»±»¿ªÊÍ£¬£¬ÖÁÉÙ±£ÕÏÔÚʹÓ÷ì϶¶ÔÏóʱ²»±»¿ªÊÍ£¬£¬ÕâÀïҪѡȡפÁôʽÄÚ´æÕ¼Î»£¬£¬Äܹ»²ÉÈ¡ÈÃijЩϵͳŲÓùý³Ì×èÈû¡£¡£


slab»º´æË鯬»¯ÎÊÌ⣬£¬ÕâÀïҪռλµÄ¶ÔÏó¾ÞϸΪ1008£¬£¬¶ÔÏó³ß´ç±ÈÁ¦´ó£¬£¬Õ¼¾ÝËÄ·ÖÖ®Ò»Ò³£¬£¬±ÈÁ¦ÕûÆë£¬£¬Ó¦¸ÃûÓÐË鯬»¯ÎÊÌâ¡£¡£


ÄÇôÈôºÎÅж϶ÑÅçÊÇ·ñ³É¹¦ÄØ£¿


ͨÓÃÇé¿öÏ£¬£¬ÔÚ½øÐжÑÅçʱ³½£¬£¬»ú¹Ø¶ÑÅç¶ÔÏóʱ£¬£¬ÓбØÒªÔÚ¶ÔÓ¦·ì϶¶ÔÏóµÄÒ»Ð©ÌØÊâ³ÉÔ±ÓòµÄÄÚ´æÆ«ÒÆ´¦ÉèÖÃmagic value£¬£¬¶øºóÄܹ»Ñ¡È¡ÏµÍ³Å²ÓÃÈ¥»ñÈ¡·ì϶¶ÔÏóÖÐÓйØÊý¾Ý½øÐÐÅжÏ¡£¡£netlink_sock½á¹¹Ì弸¸ö¹Ø¼üµÄ³ÉÔ±ÈçÏ¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ѡȡgetsocknameϵͳŲÓûñÈ¡Êý¾Ý£¬£¬getsockname»áŲÓÃnetlink_getname¡£¡£¾ßÌå¿´Ò»ÏÂnetlink_getnameº¯Êý£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


´úÂë1576ÐУ¬£¬½«netlink_sock¶ÔÏóÖеÄportid¸´ÖƸønladdr->nl_pid¡£¡£´úÂë1577ÐУ¬£¬ÈôÊÇnlk->groupΪ0£¬£¬½«nladdr->nl_groups¸³ÖµÎªNULL£¬£¬ÕâÀïÔ¤·À½âÒýÓÃnlk->groupsÖ¸Õ룬£¬Ö±½ÓÄܹ»ÔÚ»ú¹Ø¶ÑÅç¶ÔÏóʱ½«groupsÓòÌîÁã¡£¡£¶ønladdrÊÇ´Óaddrת»»¹ýÀ´µÄ£¬£¬addr¾ÍÊÇ´ÓÓû§²ã´«ÈëµÄ»º³åÇø¡£¡£


¶ÑÅç³É¹¦ÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ͨ³£Çé¿öÊǸ²¸Ç½á¹¹ÌåÖеĺ¯ÊýÖ¸Õë»òÕßÔ̺¬º¯ÊýÖ¸ÕëµÄ½á¹¹Ìå³ÉÔ±£¬£¬ÕâÊÓÇé¿ö¶ø¶¨¡£¡£ÕâÀïÑ¡Ôñ¸²¸ÇwaitÆÚ´ý¶ÓÁС£¡£netlink_sock½á¹¹ÌåÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


wait_queue_haed_t½á¹¹ÌåÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


task_list³ÉÔ±ÊÇÒ»¸öË«ÏòÑ­»·Á´±íÍ·£¬£¬task_listÖÐÁ´½ÓµÄÿһ¸ö³ÉÔ±¶¼ÊDZØÒª´¦ÖÃµÄÆÚ´ýÀý³ÌÔªËØ¡£¡£ÄǸÃÈôºÎʹÓÃÕâ¸ö³ÉÔ±£¿¿´ÈçÏ´úÂë¡£¡£


OG¶«·½Ìü¡¤(Öйú´ó½)


ÕâÊÇnetlink_setsockoptº¯ÊýÖеĴúÂëÆ¬¶Î£¬£¬Ç°Ã渴ԭÏß³ÌÐÂÉú·ÖÎö¹ý£¬£¬ÕâÀォ»áŲÓÃnetlink_sock¶ÔÏóÖÐµÄÆÚ´ýÀý³Ì£¬£¬Ö±½ÓʹÓòÎÊýnlk->wait¡£¡£³ÖÐøÉî¿Ì·ÖÎö£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


ŲÓÃ__wake_up_commonº¯Êý£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


´úÂë70ÐУ¬£¬ºêlist_for_each_entry_safe±éÀúq->task_listÖеijÉÔ±£¬£¬·µ»Øµ½curr¡£¡£´úÂë68ÐУ¬£¬currΪwait_queue_tÖ¸Õ룬£¬×¢Ã÷q->task_listÁ´±íÖдæµÄÊÇwait_queue_tÀàÐ͵ÄÔªËØ£¬£¬wait_queue_t½á¹¹ÌåÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


wait_queue_t½á¹¹ÌåÖÐÓÐÒ»¸öº¯ÊýÖ¸Õëfunc¡£¡£ÔÙ¿´__wake_up_commonº¯ÊýÖУ¬£¬´úÂë73ÐУ¬£¬Ö±½ÓÖ´ÐÐcurr>funcº¯Êý£¬£¬Äܹ»Í¨¹ý»ú¹Ø__wait_queueµÄfunc²ÎÊý½ÚÖÆRIP¡£¡£ÔٻعýÉõ¿´list_for_each_entry_safeºê£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


posÊÇ__wait_queueÔªËØ£¬£¬´úÂë62ÐУ¬£¬¶Ôpos->member.next½øÐÐÏàʶÒýÓ㬣¬ÕâÀïµÄpos->member¾ÍÊÇ__wait_queueÖеÄtask_list¡£¡£__wait_queueÖеÄtask_listÒ²ÊÇÒ»¸öÁ´±íÍ·£¬£¬±ØÒªÖ¸ÏòÒ»¸ölist_head£¬£¬ËùÒÔ»¹±Ø±ØÒª»ú¹ØÒ»¸ö¼ÙµÄlist_headÒÔ±ãÓÚ¸Ãºê½øÐнâÒýÓᣡ£²âÊÔÈçÏ£º£º£º


OG¶«·½Ìü¡¤(Öйú´ó½)


½ÓÏÂÀ´¾ÍÊÇͨ¹ýROPÁ´ÈƹýSMEPÖ´ÐÐÌáȨ´úÂë¡£¡£³É¹¦ÌáȨºóÈçÏÂËùʾ£º£º£º

OG¶«·½Ìü¡¤(Öйú´ó½)