2017-03-22 17 views
5

Bu soru linux kernel 4.10 ile ilgilidir.Yüklenebilir çekirdek modülünü ağaçta işaretleme

LKM çekirdek neden olur dışı ağacının bir uyarı yazdırmak için yükleme:

module: loading out-of-tree module taints kernel.

Bu module.c bu check yükseltir: if (!get_modinfo(info, "intree")) {

o "intree dikişler get_modinfo Okuma ".ko dosyasında sadece bir sihirli-dize livnig dosyasıdır. Benim sistemde bulunan rastgele bir LKM üzerinde readelf Running

bunu gösterir:

readelf -a imon.ko | grep intree 161: 00000000000006c0 9 OBJECT LOCAL DEFAULT 13 __UNIQUE_ID_intree1

basit, özel hello_world LKM içinde intree bakarken sonuç verir.

Bu aslında durum mu?

Bazı modüller ağaçta nasıl işaretlenir? Modüle (MODULE_LICENCE gibi) bir makro ekleyerek veya modülü belirli bir şekilde veya başka bir şekilde oluşturarak mı yapılır? Kısacası

+0

Ağaç dışında bir modülü neden ağaçta işaretlemek istiyorsunuz? Tüm bu yapacağım, kernel geliştiricileri rahatsız etmektir. – duskwuff

cevap

4

, yapı sistemi "modulename .mod.c" dosyası ancak ve ancak modül inşa ediliyor ise intree hattı MODULE_INFO(intree, "Y"); eklemek contrives.

Bu satırı, modülünüzün normal ".c" dosyalarından birine ekleyerek sistemi kandırmanın bariz bir yolu vardır, ancak neden istediğinizden emin değilim.

daha uzun sürüm ....

dış modüller normalde buna benzer bir komutla inşa edilir:

$ make M=`pwd` modules 

veya eski sözdizimi:

$ make SUBDIRS=`pwd` modules 

olmayan bir varlığı M veya SUBDIRS numaralı kuşak, KBUILD_EXTMOD değişkenini ayarlamak için çekirdeğin üst düzeyindeki "Makefile" ye neden olur. Normal bir çekirdek yapısı için ayarlanmayacak.

Modül binasının 2. aşaması için ("Bina modülleri, aşama 2" mesajı çıktığında), "scripts/Makefile.modpost" makefile komutunu çalıştırır. Bu, KBUILD_EXTMOD ayarlandığında scripts/mod/modpost farklı seçeneklerle çalışır. Özellikle, KBUILD_EXTMOD ayarlandığında -I seçeneği kullanılır. "Komut/mod/modpost.c" olarak modpost kaynağı bakıldığında

, external_module değişken 0 başlangıç ​​değeri vardır, ama -I seçenek ikinci parametre is_intree çağrılır 1 olarak işlev add_intree_flag() ayarlar !external_module olarak ayarlayın. add_intree_flag() işlevi, MODULE_INFO(intree, "Y"); "modulename .mod.c" dosyasına, yalnızca is_intree parametresi true ise yazar.

Yani intree modülleri ve harici modüllerin arasındaki fark " modulename .mod.c" dosyasında MODULE_INFO(intree, "Y"); makro çağrı bulunmasıdır. Bu " modulename .mod.o" derlenir ve " modulename .ko" dosyasını oluşturmak için modülün diğer nesne dosyalarıyla bağlantılıdır.