2011-12-13 13 views
6

Sto imparando il driver di rete di linux recentemente, e mi chiedo che se ho molte schede di rete nello stesso tipo sulla mia scheda, come le guida il kernel? Il kernel ha bisogno di caricare lo stesso driver molte volte? Penso che non sia possibile, insmod non lo farà, quindi come posso far funzionare allo stesso tempo tutte le carte dello stesso tipo?In che modo linux gestisce molte schede di rete con lo stesso driver?

riguarda

risposta

10

Lo stato di ogni scheda (indirizzi I/O, IRQ, ...) è memorizzato in una struttura specifica del driver che viene passata (direttamente o indirettamente) a ogni punto di ingresso del driver che può in questo modo differenziare il carte. In questo modo lo stesso codice può controllare diverse carte (il che significa che sì, il kernel mantiene solo un'istanza del modulo di un driver, indipendentemente dal numero di dispositivi che controlla).

Ad esempio, dare un'occhiata a drivers/video/backlight/platform_lcd.c, che è un driver di alimentazione LCD molto semplice. Contiene una struttura denominata platform_lcd privata di questo file e memorizza lo stato dell'LCD (indipendentemente dal fatto che sia alimentato e che sia sospeso). Un'istanza di questa struttura è allocata nella funzione probe del driver tramite kzalloc, ovvero una per dispositivo LCD, e memorizzata nel dispositivo della piattaforma che rappresenta l'LCD utilizzando platform_set_drvdata. L'esempio che è stato assegnato per questo dispositivo viene quindi recuperato indietro all'inizio di tutte le altre funzioni del driver in modo che sappia che esempio si sta lavorando:

struct platform_lcd *plcd = to_our_lcd(lcd); 

to_our_lcd espande a lcd_get_data che si espande ad dev_get_drvdata (a controparte di platform_set_drvdata) se si guarda include/linux/lcd.h. La funzione può quindi sapere per quale stato è stato invocato lo stato del dispositivo.

Questo è un esempio molto semplice e il driver platform_lcd non controlla direttamente alcun dispositivo (questo è rinviato a un puntatore di funzione nei dati della piattaforma), ma aggiunge parametri specifici dell'hardware (IRQ, base I/O, ecc. .) e ottieni come funziona il 99% dei driver in Linux.

+0

Grazie mille, so come aggiungere più di uno stesso dispositivo nel kernel, basta aumentare l'ID di platform_device struct, 0,1,2 ecc., Ora il driver può rilevare bene questi dispositivi. – liunx

+0

Per i dispositivi della piattaforma, sì - e puoi anche impostare l'id su -1 per specificare che ci può essere solo un'istanza del dispositivo nel sistema (Linux quindi ometterà l'ID quando stamperà il nome del dispositivo per riflettere quello). Tieni presente che i dispositivi piattaforma sono particolari e che altri bus potrebbero funzionare in un modo diverso, ad es. identificando i dispositivi tramite i loro indirizzi anziché un numero. – Gnurou

+0

Buoni consigli, grazie ancora! – liunx

4

Il codice del driver viene caricato solo una volta, ma alloca una struttura contesto separato per ogni carta. In genere vedrai un struct pci_driver con un puntatore di funzione .probe. La funzione probe viene chiamata una volta per ogni scheda dal codice di supporto PCI e chiama alloc_etherdev per allocare un'interfaccia di rete con spazio per qualsiasi contesto privato di cui ha bisogno.

+0

Grazie mille per la tua risposta! – liunx

Problemi correlati