2014-10-01 14 views
6

Şu anda nasıl çalıştığını/nasıl çalıştığını öğrenmek için bir "üçüncü taraf" sürücüsünün kodunu inceliyorum. Ben this one gibi sitelere bir göz attım, bu yüzden temel öncülün nasıl çalıştığını anlıyorum, ama ben burada #ifdef MODULE'un amacını anlamıyorum. Google gerçekten çok fazla yardım değil, ama tanımın bir çekirdek modülünü ifade ettiğini düşünüyorum. (Bu da tamamen yeni duyuyorum.)#ifdef MODULE'unun amacı, module_exit() etrafında mı?

module_init(os_driver_init); 
#ifdef MODULE 
module_exit(os_driver_cleanup); 
#endif 

Sorum ben #ifdef ifadeyi çıkarırsanız ne olur, nedir? Ayrıca, neden/ne zaman #ifdef bildirimini eklemek gerekli olurdu?

+1

Başka bir seçenek var mı (kodun aşağı kısmında) 'module_exit (...)' satırı? Alternatif işlevler çağrılabilir ve "ifdef MODULE" bu – chrisb2244

+0

denetler Belki de Sürücü çekirdek çekirdeğe derlendiğinde tanımlanmalıdır? http://www.fsl.cs.sunysb.edu/kernel-api/re02.html – user694733

+0

Bu "üçüncü taraf" sürücü koduna bağlanabilir misiniz? Gösterdiğiniz # ifdef, artık orada olmamalıdır. –

cevap

6

Linux çekirdeğinde, çoğu sürücü ya çekirdek görüntüsünün statik olarak bağlanmış (yerleşik) ya da dinamik olarak yüklenmiş modüller (.ko dosyaları) olarak oluşturulabilir.

MODULE makrosu, bir modülün parçası olarak derlendiğinde ve doğrudan çekirdeğe yerleştirildiğinde tanımlanmamış bir C dosyası için tanımlanır.

Gösterdiğiniz kod, modül olarak derlendiğinde yalnızca modül çıkış işlevini os_driver_cleanup olarak tanımlamaktadır. Ancak, bu yapı modern çekirdek kodunda gereksizdir; include/linux/init.h, module_exit() ürününü, uygulaması #ifdef MODULE olan bir makro olarak tanımlar.

Temel olarak, her zaman bir çıkış işlevi sağlamalı ve module_exit() çevresinde #ifdef'u bırakmalısınız. Ayrıca, çıkış işlevinizi, modüler/modüler olmayan durumda sizin için kodun dahil edilmesini düzgün bir şekilde kontrol edecek olan __exit ile işaretlemelisiniz.

İşte uygun init/çıkış kodu örneği.

static int __init foo_init(void) 
{ 
    /* Register driver, etc. */ 
} 

static void __exit foo_cleanup(void) 
{ 
    /* Unregister driver, etc. */ 
} 

module_init(foo_init); 
module_exit(foo_cleanup);