±¦ÔËÀ³¹Ù·½ÍøÕ¾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¼´¿É¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÐÐ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º¯Êý¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


¿ªÊÍ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µÄʵÏÖ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


!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¸üΪ·½±ã £¬´úÂëÈçÏ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÐÐ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µÄÖµ£¿ÀíÂÛÉÏÊÇÆëÈ«Äܹ»µÄ £¬¿´¿´ÈôºÎ´ÓÓû§²ã´ïµ½Õâ¸öº¯Êý¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ͨ¹ý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º¯ÊýʵÏÖÈçÏ¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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

±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


Õû¸öº¯ÊýÖÐ £¬Óû§ÄܽÚÔìµÄ²»¶à¡£ÐÐ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µÄ²Ù×÷¡£


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÐÐ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Óï¾äºó £¬¿´ÈçÏ´úÂ룺


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


ÔÚNetlink_setsockoptº¯ÊýÖУº


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ÐÐ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 £¬´úÂëÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


·ì϶¸´ÏÖ


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


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


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


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


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


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


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


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


ŲÓÃ__wake_up_commonº¯Êý£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


´úÂë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½á¹¹ÌåÈçÏ£º


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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


±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾


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

±¦ÔËÀ³¡¤(ÖйúÇø)×îйٷ½ÍøÕ¾