2011-12-19 16 views
28

Bir çekirdek modülünü derlerken, bir derleme seçeneği ekleyerek bir UYARI aldım, CONFIG_DEBUG_SECTION_MISMATCH = y. Bu konuda bana daha detaylı bilgi vermek:Çekirdek bölümü uyuşmazlığı nedir?

WARNING: \**\*path to module\***(.text+0x8d2): Section mismatch in reference from the function Pch_Spi_Enable_Bios_Wr() to the variable .devinit.data:ich9_pci_tbl.22939 
The function Pch_Spi_Enable_Bios_Wr() references 
the variable __devinitdata ich9_pci_tbl.22939. 
This is often because Pch_Spi_Enable_Bios_Wr lacks a __devinitdata 
annotation or the annotation of ich9_pci_tbl.22939 is wrong. 

bunu tespit gitmek nasıl söz, tam çekirdek bölümü uyumsuzluğu olduğunu ne değildir bulamadık.

cevap

35

Belirli bir ömür boyu olan bir bölümdeki bir işlev, farklı bir yaşam süresi olan bir bölümde bulunan bir öğeye başvuruda bulunduğu anlamına gelir.

Çekirdek ikili bağlandığında, kodun ve verilerin farklı bölümleri farklı bölümlere ayrılır. Bu bölümlerin bazıları sürekli olarak yüklenir, ancak bazıları artık ihtiyaç duyulmadığında kaldırılır (örneğin önyükleme sırasında yalnızca önyükleme sırasında yapılması gerekenler önyükleme tamamlandıktan sonra serbest bırakılabilir - bu bellek tasarrufu sağlar).

Uzun süren bir bölümdeki bir işlev, ayrılabilir bölümlerden birinde yer alan verilere başvuruyorsa, bir sorun var demektir - bu veriler, daha önce serbest bırakıldığında erişmeye çalışarak her türlü çalışma zamanına yol açabilir. sorunlar.

Bu kod yazılmadıkça veya çok tanıdık olmadıkça, kendinizi düzelteceğinize dair bir uyarı değildir. Doğru bölüme girecek şekilde (veya atıfta bulunduğu veriler) doğru bir şekilde ekleyerek düzeltilir. Doğru düzeltme, yalnızca çekirdeğin o kısmının ayrıntılı bilgisi ile belirlenebilir. Bu bölümlerin ve ek açıklamalar listesi için


, Çekirdek kaynak ağacında include/linux/init.h başlığına bakınız:

/* These macros are used to mark some functions or 
* initialized data (doesn't apply to uninitialized data) 
* as `initialization' functions. The kernel can take this 
* as hint that the function is used only during the initialization 
* phase and free up used memory resources after 
* 
* Usage: 
* For functions: 
* 
* You should add __init immediately before the function name, like: 
* 
* static void __init initme(int x, int y) 
* { 
* extern int z; z = x * y; 
* } 
* 
* If the function has a prototype somewhere, you can also add 
* __init between closing brace of the prototype and semicolon: 
* 
* extern int initialize_foobar_device(int, int, int) __init; 
* 
* For initialized data: 
* You should insert __initdata between the variable name and equal 
* sign followed by value, e.g.: 
* 
* static int init_variable __initdata = 0; 
* static const char linux_logo[] __initconst = { 0x32, 0x36, ... }; 
* 
* Don't forget to initialize data not at file scope, i.e. within a function, 
* as gcc otherwise puts the data into the bss section and not into the init 
* section. 
* 
* Also note, that this data cannot be "const". 
*/ 

/* These are for everybody (although not all archs will actually 
    discard it in modules) */ 
#define __init  __section(.init.text) __cold notrace 
#define __initdata __section(.init.data) 
#define __initconst __section(.init.rodata) 
#define __exitdata __section(.exit.data) 
#define __exit_call __used __section(.exitcall.exit) 

Diğerleri daha yorum ve açıklamalarla birlikte, izleyin. başka bir bölüme bir bölümünden
referanslar yasadışı varsa

bölüm uyumsuzluğu analiz kontrolleri:

da CONFIG_DEBUG_SECTION_MISMATCH KConfig sembolü için yardım metni bakın.
Linux bağlantı sırasında veya çalışma sırasında bazı bölümleri
bırakın ve bu bölümlerde daha önce herhangi bir kod/veri kullanımı
büyük olasılıkla bir hatayla sonuçlanır. kod sonuçlanan
/veri belirli bölümlerde yerleştirilen kod fonksiyonları ve değişkenler

__init ile açıklamalı, __devinit vb (/ Linux/init.h dahil tam listesine bakınız).
bölüm uyuşmazlığı analizi daima tam
çekirdek yapı sonra yapılır ancak bu seçeneğin etkinleştirilmesi ek olarak
yapacak aşağıdadır:

  • gcc için inline-fonksiyonları denilen -fno--once seçeneği ekleyin


    işlevinde olmayan bir işlevde not girilmiş bir işlev belirtildiğinde, bölüm bilgilerini kaybederiz ve bu nedenle
    analizleri yasa dışı referansı yakalamaz.
    Bu seçenek gcc'nin satır içi satır içi ile daha az olmasını söyler, ancak daha büyük bir çekirdekte
    sonucunu verir. Biz vmlinux.o bölüm uyuşmazlığı analizi çalıştırmak biz
    uyumsuzluğu tanıtıldı
    nerede olduğuna dair valueble bilgi kaybettiğinde
  • her modül/yerleşik in.o
    için bölüm uyuşmazlığı analizi çalıştırın.


    her bir modül/dahili in.o dosyasının analizi, uyumsuzluğun
    kaynağına ne kadar yakın olduğunu söyler. Bunun dezavantajı, aynı
    uyuşmazlığını en az iki kez raporlayacağımızdır.
  • Rapor edilen bölüm uyuşmazlıkları için
    çözümüne yardımcı olması için modpost'tan ayrıntılı raporlamayı etkinleştirin.