Как Linux управляет многими сетевыми картами с одним и тем же драйвером? - PullRequest
6 голосов
/ 13 декабря 2011

Недавно я изучаю сетевой драйвер linux, и мне интересно, как, если у меня на плате много сетевых карт одного типа, как ядро ​​управляет ими?Нужно ли ядру загружать один и тот же драйвер много раз?Я думаю, что это невозможно, insmod не будет этого делать, так как я могу заставить работать карты всех одинаковых типов одновременно?

С уважением

Ответы [ 2 ]

10 голосов
/ 14 декабря 2011

Состояние каждой карты (адреса ввода / вывода, IRQ и т. Д.) Сохраняется в специфической для драйвера структуре, которая передается (прямо или косвенно) каждой точке входа драйвера, которая может таким образом дифференцировать карты , Таким образом, один и тот же код может управлять разными картами (это означает, что да, ядро ​​хранит только один экземпляр модуля драйвера независимо от количества устройств, которыми оно управляет).

Например, посмотрите на drivers/video/backlight/platform_lcd.c, который является очень простым драйвером питания ЖК-дисплея. Он содержит структуру с именем platform_lcd, которая является приватной для этого файла и хранит состояние ЖК-дисплея (включен ли он и приостановлен). Один экземпляр этой структуры выделяется в функции probe драйвера через kzalloc, то есть по одному на устройство LCD, и сохраняется в платформенном устройстве, представляющем LCD, используя platform_set_drvdata. Экземпляр, который был выделен для этого устройства, затем возвращается в начало всех других функций драйвера, чтобы он знал, над каким экземпляром он работает:

struct platform_lcd *plcd = to_our_lcd(lcd);

to_our_lcd расширяется до lcd_get_data, который сам расширяется до dev_get_drvdata (аналог platform_set_drvdata), если вы посмотрите на include/linux/lcd.h. Затем функция может знать, для какого состояния было вызвано устройство.

Это очень простой пример, и драйвер platform_lcd не управляет напрямую каким-либо устройством (это откладывается на указатель функции в данных платформы), но добавляет специфичные для оборудования параметры (IRQ, база ввода-вывода, и т.д.), и вы получите, как работают 99% драйверов в Linux.

4 голосов
/ 13 декабря 2011

Код драйвера загружается только один раз, но он выделяет отдельную структуру контекста для каждой карты. Обычно вы увидите struct pci_driver с указателем на функцию .probe. Функция проверки вызывается один раз для каждой карты с помощью кода поддержки PCI и вызывает alloc_etherdev для выделения сетевого интерфейса с пространством для любого частного контекста, в котором она нуждается.

...