¡¡¡¡²»¹ýÎÒÔÚÏÖÔڵĴúÂëÀïûÓз¢ÏÖÓÐʹÓÃ__safeÕâ¸ö¶¨ÒåµÄµØ·½£¬²»ÖªµÀÊDz»ÊDZàÒëÆ÷ÏÖÔÚÒѾ֧³ÖÕâÖÖÌØÊâµÄÇé¿öÁË£¬ËùÒԾͲ»ÓÃÔÙ¼ÓÕâÑùµÄ´úÂëÁË¡£
# define __force __attribute__((force)) |
¡¡¡¡±íʾËù¶¨ÒåµÄ±äÁ¿ÀàÐÍÊÇ¿ÉÒÔ×öÇ¿ÖÆÀàÐÍת»»µÄ£¬ÔÚ½øÐÐSparse·ÖÎöµÄʱºò£¬ÊDz»Óñ¨¸æ¾¯ÐÅÏ¢µÄ¡£
# define __nocast __attribute__((nocast)) |
¡¡¡¡ÕâÀï±íʾÕâ¸ö±äÁ¿µÄ²ÎÊýÀàÐÍÓëʵ¼Ê²ÎÊýÀàÐÍÒ»¶¨µÃ¶ÔµÃÉϲÅÐУ¬Òª²»¾ÍÔÚSparseµÄʱºòÉú²ú¸æ¾¯ÐÅÏ¢¡£
# define __iomem __attribute__((noderef, address_space(2))) |
¡¡¡¡Õâ¸ö¶¨ÒåÓë__user, __userÊÇÒ»ÑùµÄ£¬Ö»²»¹ýÕâÀïµÄ±äÁ¿µØÖ·ÊÇÐèÒªÔÚÉ豸µØÖ·Ó³Éä¿Õ¼äµÄ¡£
# define __acquires(x) __attribute__((context(x,0,1))) # define __releases(x) __attribute__((context(x,1,0))) |
¡¡¡¡ÕâÊÇÒ»¶ÔÏ໥¹ØÁªµÄº¯Êý¶¨Ò壬µÚÒ»¾ä±íʾ²ÎÊýxÔÚÖ´ÐÐ֮ǰ£¬ÒýÓüÆÊý±ØÐëΪ0£¬Ö´Ðкó£¬ÒýÓüÆÊý±ØÐëΪ1£¬µÚ¶þ¾äÔòÕýºÃÏà·´£¬Õâ¸ö¶¨ÒåÊÇÓÃÔÚÐÞÊκ¯Êý¶¨ÒåµÄ±äÁ¿µÄ¡£
# define __acquire(x) __context__(x,1) # define __release(x) __context__(x,-1) |
¡¡¡¡ÕâÊÇÒ»¶ÔÏ໥¹ØÁªµÄº¯Êý¶¨Ò壬µÚÒ»¾ä±íʾҪÔö¼Ó±äÁ¿xµÄ¼ÆÊý£¬Ôö¼ÓÁ¿Îª1£¬µÚ¶þ¾äÔòÕýºÃÏà·´£¬Õâ¸öÊÇÓÃÀ´º¯ÊýÖ´ÐеĹý³ÌÖС£
¡¡¡¡ÒÔÉÏËľäÈç¹ûÔÚ´úÂëÖгöÏÖÁ˲»Æ½ºâµÄ×´¿ö£¬ÄÇôÔÚSparseµÄ¼ì²âÖоͻᱨ¾¯¡£µ±È»£¬SparseµÄ¼ì²âÖ»ÊÇÒ»¸öÊֶΣ¬¶øÇÒÊǾ²Ì¬¼ì²é´úÂëµÄÊÖ ¶Î£¬ËùÒÔËüµÄ°ïÖúÓÐÏÞ£¬ÓпÉÄÜ°ÑÕýÈ·µÄÈÏΪÊÇ´íÎóµÄ¶ø·¢³ö¸æ¾¯¡£ÒªÊǶÔÒÔÉÏËľäµÄÒâ˼»¹ÊDz»Ì«Á˽âµÄ»°£¬ÇëÔÚÔ´´úÂëÀïËÑÒ»ÏÂÏà¹Ø·ûºÅµÄÓ÷¨¾ÍÄÜÖªµÀÁË¡£Õâ µÚÒ»×éÓëµÚ¶þ×飬ÔÚ±¾ÖÊÉÏ£¬ÊÇûʲôÇø±ðµÄ£¬Ö»ÊÇʹÓõÄλÖÃÉÏ£¬ÓÐËùÇø±ð°ÕÁË¡£
# define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) |
¡¡¡¡Õâ¾ä»°µÄÒâ˼¾ÍÊÇÌõ¼þËø¡£µ±cÕâ¸öÖµ²»Îª0ʱ£¬ÔòÈüÆÊýÖµ¼Ó1£¬²¢·µ»ØֵΪ1¡£²»¹ýÕâÀïÎÒÓÐÒ»¸öÒÉÎÊ£¬¾ÍÊÇÔÚÕâÀÓÐÒ»¸ö__cond_lock¶¨ Ò壬µ«Ã»Óж¨ÒåÏàÓ¦µÄ__cond_unlock£¬ÄÇôÔÚ±äÁ¿µÄÊÍ·ÅÉÏ£¬¾Íû°ì·¨×öµ½Ò»Ö¡£¶øÇÒÎÒ²éÁËһϹØÓÚspin_trylock()Õâ¸öº¯ÊýµÄ¶¨ Ò壬Ëü¾ÍÓÃÁË__cond_lock£¬¶øÇÒÀïÃæÓÖÓÃÁË_spin_trylockº¯Êý£¬ÔÚ_spin_trylockº¯ÊýÀÔÙ¾¹ý¼¸´Îµ÷Ó㬾ͻáʹÓõ½ __acquireº¯Êý£¬ÕâÑùµÄ»°£¬Ï൱ÓÚÒ»¸ö²Ù×÷£¬¾Í½øÐÐÁËÁ½´Î¼ÆË㣬»áµ¼ÖÂSparseµÄ¼ì²â³öÏָ澯ÐÅÏ¢£¬¾¹ýÎÒд´úÂë½øÐÐʵÑ飬ÑéÖ¤ÁËÎÒµÄÅжϣ¬ ȷʵÊÇ»á³öÏָ澯ÐÅÏ¢£¬Èç¹ûÎÒдÁ½±éunlockÖ¸Á¾ÍûÓи澯ÐÅÏ¢ÁË£¬µ«ÕâÊÇÓë³ÌÐòµÄÔËÐÐÊDz»Ò»Öµġ£
extern void __chk_user_ptr(const volatile void __user *); extern void __chk_io_ptr(const volatile void __iomem *); |
¡¡¡¡ÕâÁ½¾ä±È½ÏÓÐÒâ˼¡£ÕâÀïÖ»ÊǶ¨ÒåÁ˺¯Êý£¬µ«ÊÇ´úÂëÀïûÓк¯ÊýµÄʵÏÖ¡£ÕâÑù×öµÄÄ¿µÄ£¬¾ÍÊÇÔÚ½øÐÐSparseµÄʱºò£¬ÈÃSparse¸ø´úÂë×ö±ØÒªµÄ²ÎÊýÀàÐͼì²é£¬ÔÚʵ¼ÊµÄ±àÒë¹ý³ÌÖУ¬²¢²»ÐèÒªÕâÁ½¸öº¯ÊýµÄʵÏÖ¡£
#define notrace __attribute__((no_instrument_function)) |
¡¡¡¡ÕâÒ»¾ä£¬ÊǶ¨ÒåÁËÒ»¸öÊôÐÔ£¬Õâ¸öÊôÐÔ¿ÉÒÔÓÃÀ´ÐÞÊÎÒ»¸öº¯Êý£¬Ö¸¶¨Õâ¸öº¯Êý²»±»¸ú×Ù¡£ÄÇôÕâ¸öÊôÐÔµ½µ×ÊÇÔõô»Ø×ÓÊÂÄØ£¿ÔÀ´£¬ÔÚgcc±àÒëÆ÷ÀïÃ棬ʵ ÏÖÁËÒ»¸ö·Ç³£Ç¿´óµÄ¹¦ÄÜ£¬Èç¹ûÔÚ±àÒëµÄʱºò°ÑÒ»¸öÏàÓ¦µÄÑ¡ÔñÏî´ò¿ª£¬ÄÇô¾Í¿ÉÒÔÔÚÖ´ÐÐÍê³ÌÐòµÄʱºò£¬ÓÃһЩ¹¤¾ßÀ´ÏÔʾÕû¸öº¯Êý±»µ÷ÓõĹý³Ì£¬ÕâÑù¾Í²»ÐèÒª ÈóÌÐòÔ±ÊÖ¶¯ÔÚËùÓеĺ¯ÊýÀïÒ»µãµãÌí¼ÓÄÜÏÔʾº¯Êý±»µ÷Óùý³ÌµÄÓï¾ä£¬ÕâÑùºÄʱºÄÁ¦£¬»¹ÈÝÒ׳ö´í¡£ÄÇô¶ÔÓ¦ÔÚÓ¦ÓóÌÐò·½Ã棬¿ÉÒÔʹÓÃGraphvizÕâ¸ö¹¤ ¾ßÀ´½øÐÐÏÔʾ£¬ÖÁÓÚʹÓÃ˵Ã÷ÓëÈí¼þʵÏÖµÄÔÀí¿ÉÒÔ×Ô¼ºÔÚÍøÉϲéÒ»²é£¬ºÜÈÝÒײ鵽¡£¶ÔÓ¦ÓÚÄںˣ¬ÒòΪÄÚºËÒ»Ö±ÊÇÔÚÔËÐн׶Σ¬ËùÒԾͲ»ÄÜʹÓÃÕâÌ׶«Î÷ÁË£¬ÄÚºË ÊÇÔÚ×Ô¼ºµÄÄÚ²¿ÊµÏÖÁËÒ»¸öftraceµÄ»úÖÆ£¬±àÒëÄں˵Äʱºò£¬Èç¹û´ò¿ªÕâ¸öÑ¡ÏÄÇôͨ¹ý¹ÒÔØÒ»¸ödebugfsµÄÎļþϵͳÀ´½øÐÐÏàÓ¦ÄÚÈݵÄÏÔʾ£¬¾ßÌå µÄ²Ù×÷²½Ö裬¿ÉÒԲο´ÄÚºËÔ´ÂëËù´øµÄÎĵµ¡£ÄÇÉÏÃæ˵ÁËÕâô¶à£¬ÓënotraceÕâ¸öÊôÐÔÓÐʲô¹ØϵÄØ£¿ÒòΪÔÚ½øÐк¯Êýµ÷ÓÃÁ÷³ÌµÄÏÔʾ¹ý³ÌÖУ¬ÊÇʹÓÃÁËÁ½¸ö ÌØÊâµÄº¯ÊýµÄ£¬µ±º¯Êý±»µ÷ÓÃÓ뺯Êý±»Ö´ÐÐÍê·µ»Ø֮ǰ£¬¶¼»á·Ö±ðµ÷ÓÃÕâÁ½¸öÌرðµÄº¯Êý¡£Èç¹û²»°ÑÕâÁ½¸öº¯ÊýµÄº¯ÊýÖ¸¶¨Îª²»±»¸ú×ÙµÄÊôÐÔ£¬ÄÇôÕû¸ö¸ú×ٵĹý³Ì ¾Í»áÏÝÈëÒ»¸öÎÞÏÞÑ»·µ±ÖС£