×ðÁú¿­¹ÙÍøÈë¿Ú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¼´¿É¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


½ÓÏÂÀ´¿´¿´Îó²îÒòÓÉ £¬ÕâÀïÒÔ4.1.0°æ±¾Ô´ÂëΪÀý¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


ÐÐ1683 £¬Å²ÓÃsock_putïÔÌ­ÒýÓüÆÊýÒ»´Î £¬×îºóreturn 1 £¬º¯Êý·µ»Ø £¬Ö±½Ógotoµ½retry±êÇ©µØ·½¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


Õâ¸öÎó²îÔ­Àí½ÏÁ¿¼òÆÓ £¬¿ÉÊÇÔõÑù´¥·¢Õâ¸öÎó²îÕվɽÏÁ¿ÖØ´ó¡£Ê×ÏÈ £¬ÔõÑùÈÃnetlink_attachskb·µ»Ø1 £¬´Ó¶øË³Ëì½øÈëretryÂß¼­¡£Ôٴλؿ´netlink_attachskbµÄʵÏÖ¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


ÈôÊÇifÅжÏÇ·ºà¹ý £¬½Ó×ÅŲÓÃnetlink_skb_set_owner_rº¯Êý £¬ÈçÏÂËùʾ¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


ÐÐ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µÄÖµ£¿ÀíÂÛÉÏÊÇÍêÈ«¿ÉÒ﵀ £¬¿´¿´ÔõÑù´ÓÓû§²ãµÖ´ïÕâ¸öº¯Êý¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


ÐÐ2285 £¬Ê×ÏÈÅжÏmsg->msg_flag²»¿ÉΪMSG_OOB £¬¼ÌÐøÍùÏ¿´¡£

×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


ÐÐ2292 £¬ÅжÏmsg->msg_namelenµÄ³¤¶È £¬ÕâÀï±ØÐ費Ϊ¿Õ £¬ËäȻҲ²»»áΪ¿Õ¡£½øÈëifºó £¬ÅжÏaddr->nl_familyÊÇ·ñ¼´ÊÇAF_NETLINK¡£ÐÐ2299 £¬ÅжÏdst_group»òdst_portid²»Îª¿Õ £¬dst_groupÌåÏֶಥģʽ £¬dst_portidÀ´×ÔÓÚaddr->nl_pid £¬Òò´Ë°ü¹Üdst_portid²»Îª¿Õ½ÏÁ¿ÈÝÒס£½ÓÏÂÀ´£º


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


Õû¸öº¯ÊýÖÐ £¬Óû§ÄÜ¿ØÖƵÄδ¼¸¡£ÐÐ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µÄ²Ù×÷¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


Õâ¶Î´úÂë»áÈÃÄ¿½ñÏ߳̽øÈëÆÚ´ý״̬ £¬Ö±½Óblock¡£ÈôÊDz»Ïë½øÈëÆÚ´ý״̬ £¬Ö»ÓÐÉèÖÃsock_flagΪSOCK_DEAD¡£¿ÉÊÇÈôÊǰÑsock_flagÉèÖóÉSOCK_DEAD £¬ÄǺóÃæÒ²Ã»ÓÐÐëÒª¾ÙÐÐ £¬Òò´ËÕâÀïÊÇÒ»¶¨Òª½øÈëÆÚ´ý״̬µÄ¡£Ò»ÖÖÇÉÃîµÄÒªÁìÊÇÖ±½ÓŲÓÃwake_up_interruptibleÇ¿ÐнÐÐÑÏ̡߳£ÄÇÔõÑùŲÓÃwake_up_interruptibleÄØ£¿º¯ÊýŲÓÃÁ´ºÜÊǼò¶Ì£ºnetlink_setsockopt->wake_up_interruptible¡£


ÔÚNetlink_setsockoptº¯ÊýÖУº


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


Õâ¸öʱ¼äsockÊÇ·Ç¿ÕµÄ £¬ifÅжÏÎªÕæ £¬½øÈënetlink_destachskb £¬½ÓמÍÊÇfreeÍ߽⡣


Îó²î¸´ÏÖ


¹ØÓÚUAFÀàÐ͵ÄÎó²î £¬Í¨ÓÃÒªÁì¾ÍÊÇʹÓöÑÅçÉäռλ¡£±¾´ÎÎó²îÖб»¶à´ÎÊͷŵŤ¾ßÊÇnetlink_sock¹¤¾ß¡£netlink_sock¹¤¾ß¾ÞϸΪ0x3f0×Ö½Ú £¬¼´ÊÇ1008byte¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


ƾ֤Äں˹¤¾ßÄÚ´æ·ÖÅɹæÔò £¬ netlink_sock¹¤¾ßÓ¦¸Ã´Ókmalloc-1024Õâ¸ö»º´æÖоÙÐзÖÅÉ¡£
slab·ÖÅÉÆ÷ÔÚ·ÖÅɹ¤¾ßʱ £¬×ñÊØºó½øÏȳöµÄ¹æÔò¡£ÏÂÃæÊÇslab·ÖÅÉÆ÷ÊÍϰà¾ßµÄÀú³Ì¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


ÒªÊͷŵŤ¾ßobjp·ÅÔÚÁËac->entry[]µÄ×îºó¡£ÏÂÃæÊÇslab·ÖÅÉÆ÷·ÖÅɹ¤¾ßµÄÀú³Ì£º


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


·ÖÅɹ¤¾ßÖ±½Ó´Óac->entry[]×îºóµ¯³öÒ»¸ö¹¤¾ß¡£


ÒÔÊÇÒ»¸ö¸Õ¸Õ±»ÊͷŵŤ¾ßÊÇÅÅÔÚÁ´±íÄ©¶Î £¬ÈôÊÇ´ËʱǡÐÒ¿÷ͳһ»º´æÖоÙÐй¤¾ß·ÖÅÉ £¬ÄǸոÕÊͷŵŤ¾ß¾Í»á±»ÖØÐ·ÖÅɳöÈ¥ £¬Õâ¾Í·ºÆðÁ½¸öÖ¸ÕëÖ¸Ïòͳһ¿éÄÚ´æµØÖ·¡£ÒªÏë°ü¹ÜÉêÇëµÄÄÚ´æÕýºÃÂäÔÚÎó²î¹¤¾ßµÄÄÚ´æÎ»ÖÃÖÐ £¬ÐèÒªÕÆÎÕס¼¸µã£º


¶ÑÅ繤¾ßʹÓõÄÄں˻º´æÓ¦¸ÃºÍÎó²î¹¤¾ßÄÚ±£´æÍ³Ò»¸ö»º´æÖС£¼´¾Þϸ±ØÐèÂäÔÚͳһ¸ökmalloc-XÖС£


ac×Ô¼ºÊÇarray_chche½á¹¹Ìå £¬¸Ã½á¹¹ÌåÊÇÍâµØ¸ßËÙ»º´æ £¬Ã¿¸öCPU¶ÔÓ¦Ò»¸ö £¬ÒÔÊÇ»¹Òª°ü¹Ü¶ÑÅçÉêÇëµÄ¹¤¾ßºÍÎó²î¹¤¾ßÔÚͳһ¸öCPUÍâµØ¸ßËÙ»º´æÖС£


ÈôÊǶÑÅçÉêÇëµÄ¹¤¾ßÖ»ÊǶÌÔÝפÁô £¬µ±¸Ãº¯Êý·µ»ØÊ±½«ÉêÇëµÄ¹¤¾ß¾ÙÐÐÁËÊÍ·Å £¬µ¼ÖÂÎÞ·¨×¼È·Õ¼Î»¡£ÒÔÊÇÒªÄܰü¹ÜÉêÇëµÄ¹¤¾ß²»±»ÊÍ·Å £¬ÖÁÉÙ°ü¹ÜÔÚʹÓÃÎó²î¹¤¾ßʱ²»±»ÊÍ·Å £¬ÕâÀïÒª½ÓÄÉפÁôʽÄÚ´æÕ¼Î» £¬¿ÉÒÔ½ÓÄÉÈÃijЩϵͳŲÓÃÀú³ÌÛÕ±Õ¡£


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


ÄÇôÔõÑùÅж϶ÑÅçÊÇ·ñÀÖ³ÉÄØ£¿


ͨÓÃÇéÐÎÏ £¬ÔÚ¾ÙÐжÑÅçʱ¼ä £¬½á¹¹¶ÑÅ繤¾ßʱ £¬ÓÐÐëÒªÔÚ¶ÔÓ¦Îó²î¹¤¾ßµÄÒ»Ð©ÌØÊâ³ÉÔ±ÓòµÄÄÚ´æÆ«ÒÆ´¦ÉèÖÃmagic value £¬È»ºó¿ÉÒÔ½ÓÄÉϵͳŲÓÃÈ¥»ñÈ¡Îó²î¹¤¾ßÖÐÏà¹ØÊý¾Ý¾ÙÐÐÅжÏ¡£netlink_sock½á¹¹Ì弸¸öÒªº¦µÄ³ÉÔ±ÈçÏ¡£


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


½ÓÄÉgetsocknameϵͳŲÓûñÈ¡Êý¾Ý £¬getsockname»áŲÓÃnetlink_getname¡£Ïêϸ¿´Ò»ÏÂnetlink_getnameº¯Êý£º


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


¶ÑÅçÀÖ³ÉÈçÏ£º


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


ÕâÊÇnetlink_setsockoptº¯ÊýÖеĴúÂëÆ¬¶Ï £¬Ç°Ãæ»Ö¸´Ï̸߳´ÉúÆÊÎö¹ý £¬ÕâÀォ»áŲÓÃnetlink_sock¹¤¾ßÖÐµÄÆÚ´ýÀý³Ì £¬Ö±½ÓʹÓòÎÊýnlk->wait¡£¼ÌÐøÉîÈëÆÊÎö£º


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


ŲÓÃ__wake_up_commonº¯Êý£º


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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


×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!


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

×ðÁú¿­Ê± - ÈËÉú¾ÍÊDz«!