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.