2013-01-20 17 views
13

Neden çoğu aygıt sürücüsündeki her işlev statiktir? Statik işlevler dosya kapsamı dışında görünmediğinden. Ardından, bu sürücü işlevi kullanıcı alanı uygulamaları tarafından nasıl çağrılır?Linux aygıt sürücüsündeki statik işlevler

+0

Muhtemel iki kopyası: http://stackoverflow.com/questions/12917198/linux-device-driver-program-where-the-program-starts/12923107#12923107 Bu statik işlevlerden bazılarına göz atıyorsunuz. Bu statik rutinlerin standart bir sürücü ara yüzü üzerinden dolaylı olarak erişilmesini sağlayan * işlem * yapısında kullanılır (örn. dosya ops). – sawdust

cevap

11

C'deki her şeyin adres olduğunu unutmayın. Bu, adresiniz varsa bir işlevi çağırabilirsiniz anlamına gelir. Çekirdeğin, sadece bunu yapan EXPORT_SYMBOL adlı bir makro vardır. Bir fonksiyonun adresini dışa aktarır, böylelikle bu fonksiyonlar bazen derleme zamanında bilinmediğinden, sürücü fonksiyonlarının üstbilgi beyanları vermeden çağrılabilir. Bu gibi durumlarda, statik niteleyici, yalnızca bu yöntemle çağrıldığından ve bu sürücü kodunu içerebilecek diğer dosyalardan değil (bazı durumlarda sürücü kod başlıklarını dahil etmek ve bunları doğrudan aramak iyi bir fikir değildir) emin olmak için yapılmıştır. .

DÜZENLEME: Kullanıcı alanını kapsamadığımı gösterdiğinden beri.

Sürücü işlevleri, genellikle doğrudan kullanıcı alanı aracılığıyla çağrılmaz (bazen, bazı durumlarda anahtar geçişini kaydetmek için bazı küçük hile yapan SYSCALL komutunun uygulanması hariç). Yani buradaki statik anahtar kelime hiçbir fark yaratmıyor. Kernel uzayında sadece bir fark yaratır. @Cong Wang tarafından işaret edildiği gibi, fonksiyonlar genellikle fonksiyon göstergelerinin bir yapısına yerleştirilir, böylece bu yapıya (yapıları, zamanlayıcılar, dosya sistemleri, ağ kodları, vb ... gibi) işaret eden yapılara sahip olmaları istenebilir.

+0

"bu yöntemle çağrılır" .Bu yöntem budur. EXPORT_SYMBOL makrosu mu demek istiyorsun? –

+0

@Sibrajas Evet, çoğunlukla dinamik sürücülere güvenmediğinizden emin olun (bunlar her zaman mevcut değildir). –

+0

Bu "cevap" bogus henüz en çok oyu aldı! Bir sürücüdeki dışa aktarılan semboller yalnızca diğer çekirdek rutinleri tarafından kullanılabilir ve kullanıcı alanından erişilemez. Sadece bir "bildiğiniz" bir adresin, bir kullanıcı uzay programının bu konuma erişebileceği anlamına gelmediğinden.Linux, bir MMU kullanan korumalı bir çekirdektir. – sawdust

7

Bu statik işlevin, modülün dışından doğrudan kullanılması gerekiyordu. Modüldeki diğer işlevler tarafından çağrılırlar, aralarında bir ioctl veya geri aramalar için arabirim olabilir. Bu yüzden kullanıcı-alanından çağrılabilirler, sadece çağrı yolundadırlar.

ağ kukla modülü bir göz atın:

static int dummy_dev_init(struct net_device *dev) 
{ 
     dev->dstats = alloc_percpu(struct pcpu_dstats); 
     if (!dev->dstats) 
       return -ENOMEM; 

     return 0; 
} 

ama bir geri arama - bu ağ cihazı kaydederken denir> ndo_init():

dummy_dev_init() açıkça statik .

static const struct net_device_ops dummy_netdev_ops = { 
     .ndo_init    = dummy_dev_init, 
     .ndo_uninit    = dummy_dev_uninit, 
     .ndo_start_xmit   = dummy_xmit, 
     .ndo_validate_addr  = eth_validate_addr, 
     .ndo_set_rx_mode  = set_multicast_list, 
     .ndo_set_mac_address = eth_mac_addr, 
     .ndo_get_stats64  = dummy_get_stats64, 
     .ndo_change_carrier  = dummy_change_carrier, 
}; 

Ve hiç kimse doğrudan dummy_dev_init() yöntemini çağırmamalıdır.

2

Çekirdeğin binlerce modülü vardır ve bunlar (veya eskiden olduğu gibi) tüm nesne dosyalarına, dinamik olarak yüklenen bir işlem aracılığıyla dinamik olarak yüklenir --ve aslında bağlanır - yürütülebilir dosyaya. static belirtilmemişse, tüm işlev adlarını tüm dışa aktarması için kaç tane ad çakışması olacağını tahmin edebilir misiniz?

Userpace uygulamaları sürücü işlevlerini doğrudan arayamaz, ancak etkileşimde bulunmak için other ways vardır.

+0

Doğrudan onları arayarak, ioctl yapmadan ya da bir aygıt ya da bu satırlar boyunca bir şey olarak kaydetmeden, belirli bir sürücünün derleme zamanı yöntemini çağırmak anlamına gelir. Sadece bir başlık veya extern işlevleri yapmak ve statik anahtar kelimeyi kaldırmak her zaman mümkündür: P –

İlgili konular