2013-01-20 36 views
13

Dlaczego każda funkcja w większości sterowników urządzeń jest statyczna? Ponieważ funkcje statyczne nie są widoczne poza zasięgiem pliku. W jaki sposób wywoływana jest funkcja sterownika w aplikacjach przestrzeni użytkownika?Funkcje statyczne w sterowniku urządzenia linuxowego

+0

Możliwy duplikat: http://stackoverflow.com/questions/12917198/linux-device-driver-program-where-the-program-starts/12923107#12923107 Nie pamiętasz, że niektóre z tych funkcji statycznych są stosowane w strukturze * operation *, które umożliwiają pośredni dostęp do tych procedur statycznych za pośrednictwem standardowego interfejsu sterownika (np. file ops). – sawdust

Odpowiedz

11

Pamiętaj, że w C wszystko jest adresem. Oznacza to, że możesz wywołać funkcję, jeśli masz adres. Jądro ma makro o nazwie EXPORT_SYMBOL, które właśnie to robi. Eksportuje adres funkcji, aby można było wywoływać funkcje sterownika bez konieczności umieszczania deklaracji nagłówków, ponieważ funkcje te czasami nie są znane podczas kompilacji. W takich przypadkach właśnie wprowadzono kwalifikator statyczny, aby zapewnić, że są one wywoływane tylko tą metodą, a nie z innych plików, które mogą zawierać ten kod sterownika (w niektórych przypadkach nie jest dobrym pomysłem uwzględnienie nagłówków kodów sterowników i wywołanie ich bezpośrednio) .

EDYCJA: Ponieważ zwrócono uwagę, że nie obejmowałem przestrzeni użytkownika.

Funkcje sterownika zwykle nie są wywoływane bezpośrednio przez przestrzeń użytkownika (z wyjątkiem implementacji instrukcji SYSCALL w systemie x86, która wykonuje pewne sztuczki, aby czasami zapisać przełącznik kontekstowy). Tak więc tutaj słowo kluczowe static nie ma znaczenia. To tylko robi różnicę w przestrzeni jądra. Jak zauważył @Cong Wang, funkcje są zwykle umieszczane w strukturze wskaźników funkcji, dzięki czemu mogą być wywoływane przez proste struktury wskazujące na tę strukturę (takie jak file_ops, schedulers, systemy plików, kod sieciowy, itp.).

+0

"wywoływana tą metodą" .Jaka jest ta metoda. Masz na myśli makro EXPORT_SYMBOL? –

+0

@Sibrajas Tak, głównie chodzi o to, aby nie polegać na sterownikach dynamicznych (które nie zawsze są dostępne). –

+0

Ta "odpowiedź" jest nieprawdziwa, ale ma najwięcej głosów ?! Wyeksportowane symbole w sterowniku mogą być używane tylko przez inne procedury jądra i nie są dostępne z przestrzeni użytkownika. Tylko dlatego, że "znasz" adres nie oznacza, że ​​program kosmiczny użytkownika może uzyskać dostęp do tej lokalizacji.Linux jest chronionym jądrem używającym MMU. – sawdust

7

Ponieważ te funkcje statyczne nie powinny być używane bezpośrednio na zewnątrz modułu. Są wywoływane przez inne funkcje w module, między innymi mogą być interfejsem do ioctl lub jakichkolwiek zwrotów. Dlatego mogą być wywoływane z przestrzeni użytkownika, są po prostu w ścieżce wywołania.

Spójrz na module atrapy sieciowe:

dummy_dev_init() jest oczywiście statyczne:

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

     return 0; 
} 

ale jest oddzwanianie -> ndo_init(), która jest wywoływana podczas rejestracji tego urządzenia sieciowego .

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, 
}; 

Oczywiste jest, że nikt nie powinien nazywać bezpośrednio dummy_dev_init().

2

Jądro ma tysiące modułów i są one (lub kiedyś były) plikami obiektów, ładowane dynamicznie za pomocą procesu podobnego do łączenia - lub są faktycznie połączone - do pliku wykonywalnego. Czy możesz sobie wyobrazić, ile będzie konfliktów nazw, jeśli wszystkie będą eksportować wszystkie nazwy funkcji, tak jak domyślne zachowanie C, chyba że podano static?

Aplikacje przestrzeni użytkownika nie mogą bezpośrednio wywoływać funkcji sterownika, ale istnieje interakcja między other ways.

+0

Dzwoniąc do nich, miałem na myśli wywołanie metody kompilacji określonego sterownika bez wykonywania ioctl lub rejestrowania się jako urządzenie lub coś podobnego. Zawsze można po prostu utworzyć nagłówek lub wyłączyć funkcje i usunąć słowo kluczowe static: P –

Powiązane problemy