2014-10-17 20 views
9

Linux çekirdeğinde çok yeniyim. Ve koddaki mevcut gürültüyü temizlemek için seyrek aracı kullanıyorum. Ben bu makroları karşılaştı:linux/compiler.h dosyalarında tanımlanan ön işlemci makrolarının amacı nedir?

# define __user  __attribute__((noderef, address_space(1))) 
    # define __kernel __attribute__((address_space(0))) 
    # define __safe  __attribute__((safe)) 
    # define __force __attribute__((force)) 
    # define __nocast __attribute__((nocast)) 
    # define __iomem __attribute__((noderef, address_space(2))) 
    # define __must_hold(x) __attribute__((context(x,1,1))) 
    # define __acquires(x) __attribute__((context(x,0,1))) 
    # define __releases(x) __attribute__((context(x,1,0))) 
    # define __acquire(x) __context__(x,1) 
    # define __release(x) __context__(x,-1) 
    # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) 
    # define __percpu __attribute__((noderef, address_space(3))) 

Ve şimdi bilmek istiyorum: onlar hataları/uyarı bildirmek için seyrek tarafından nasıl kullanıldıkları?

Sorularım:

  1. Onların derleyici ve uyarıları bildirmek için seyrek nasıl yardımcı ayrıntıları istiyorum.
  2. Bunlar nedir address_space (x)içerik (X, x, x) ve orada mı?
  3. nedir __nocast amacı, __force, __user, __safe?

cevap

4

Bütün bu makro sadece sparse bağlamında anlam düşünüyorum (Man sayfalarından here - Bütün bu özelliklere ve seyrek uyarıları orada açıklamalarını bulabilirsiniz). Kopyaladığınız kaynak dosyaya bir göz attığınızda bunları etkinleştirmek için kullanılan büyük bir __CHECKER__ makrosu vardır.

Ben gcc bu noktada onlara bir şey yaparsa emin değilim - Ben çok sessizce 2004 Linus Torvalds geri onun e-postaların birinde ... onları görmezden düşünüyorum diyordu:

Hatırlamak önemlidir: gcc için seyrek ek açıklamalar anlamsızdır. programcı programlayıcısını, 'un okunabilir bir şekilde "hey, bu işaretçinin normal bir işaretçi olmadığını" söylemesi için yararlı olabilir, ancak sonuçta, seyrek kullanmazsanız, Aslında bir şey yap.

Bu amaç için açılan bazı biletler var - http://www.spinics.net/lists/linux-sparse/msg03366.html.

+1

Makaleleri paylaştığınız için teşekkür ederiz. Ancak yine de, bu problemi bildirmek için nasıl seyrek olarak yardımcı olabileceğine dair cevabı bulamıyorum. Hala'address_space (num) 'aslında uyarının çözülmesine ve bildirilmesine nasıl yardımcı olduğunu anlamıyorum. Benzer şekilde bağlam (x, x, x). –