Что означает ядро ​​драйвера в контексте драйверов устройств ядра Linux?

Я читал книгу Linux Device Drivers, Third Edition, а в разделе «Собираем все вместе» в главе 14 они упоминают взаимодействие между «ядром PCI, ядром драйвера и отдельными драйверами PCI». И они использовали слово «ядро драйвера» несколько раз. Отличается ли «ядро драйвера» от «драйвера символьного устройства»?

Мой вопрос возникает из-за намерения понять стек InfiniBand. Стек IB охватывает как пространство пользователя, так и пространство ядра. Итак, если я пишу простую программу InfiniBand для пинг-понга для запуска на сетевой карте Mellanox ConnectX-4, мой двоичный файл будет зависеть от двух библиотек пользовательского пространства: libibverbs и libmlx5, И 3 модулей ядра: ib_uverbs, mlx5_ib и mlx5_core. Я знаю, что ib_uverbs - это драйвер символьного устройства. Но можем ли мы рассматривать модули ядра mlx5_ib и mlx5_core как некую категорию драйверов? Или их функции просто глобально экспортируются для взаимодействия с ними?


person Rohit Zambre    schedule 30.11.2017    source источник


Ответы (2)


Ядро драйвера - это общий код, который управляет драйверами, устройствами, шинами, классами и т. Д. Он не привязан к конкретной шине или устройству. Я полагаю, что в главе, на которую вы ссылаетесь, приводится несколько примеров разделения труда между драйвером шины PCI и ядром драйвера, например, см. Рисунок 14-3 (Процесс создания устройства).

Из трех модулей ядра, которые вы упомянули, два участвуют в ядре устройства: ib_uverbs регистрирует свои символьные устройства для экспорта функциональности RDMA в пространство пользователя; mlx5_core регистрирует драйвер PCI для обработки сетевых адаптеров ConnectX; mlx5_ib также можно рассматривать как драйвер, но подсистема RDMA не использует ядро ​​устройства для регистрации драйверов (у нее есть собственный API - ib_register_device).

person haggai_e    schedule 03.12.2017

что такое ядро ​​драйвера ??

Обратите внимание на следующий поток вызовов в исходном коде Linux.
tps65086_regulator_probe ---> devm_regulator_register -> Regulator_register -> device_register (/drivers/regulator/tps65086-regulator.c ---> / drivers / Regulator / core.c- -> drivers / base / core.c).
tps65086 драйвер вызывает ядро ​​регулятора, которое, в свою очередь, вызывает ядро ​​драйвера. Этот драйвер соответствует стандартной модели драйвера.

include / linux / device.h ----> здесь определены объекты модели драйвера.
drivers / base / -> Здесь определены все функции, которые работают с объектами модели драйвера.
мы можем называть это драйвером core и является базой для любого драйвера. Каркасная работа. Все регистрации приходят сюда с более высоких уровней. На этом основана любая подсистема драйверов ..weather PCI / USB / Platform.
drivers / base / core.c - это основной файл стандартной модели драйвера.
Небольшая путаница в именах - Однако мы можем сослаться на drivers / base / - как ядро ​​драйвера.

Какая-либо разница между драйвером персонажа и другим драйвером ??

/drivers/char/tlclk.c tlclk_init -> register_chrdev -> register_chrdev -> cdev_add -> kobj_map (fs / char_dev.c ---> /drivers/base/map.c).
символ регистрация устройства выполняется с помощью char_dev, драйвера файловой системы, который снова использует инфраструктуру базы моделей драйверов.

whare как несимвольный драйвер, например tps65086-Regulator.c, может быть зарегистрирован в ядре драйвера, как показано ниже. tps65086_regulator_probe ---> devm_regulator_register -> Regulator_register -> device_register -> device_add -> kobject_add (/drivers/regulator/tps65086-regulator.c ---> / drivers / Regulator / core.c ---> драйверы /base/core.c)

Кроме того, это зависит не только от типа драйвера, но и от того, что это за устройство и как с ним нужно обращаться. Вот драйвер pci, который регистрирует символьное устройство. tw_probe -> register_chrdev -> cdev_add -> kobj_map (/drivers/scsi/3w-xxxx.c -> fs / char_dev.c ---> /drivers/base/map.c)

Не существует стандартного правила, должен ли драйвер вызывать ядро ​​драйвера или нет.
Любой стек / фреймворк может иметь собственное ядро ​​для управления устройством, как в случае с драйвером mlx5_ib (drivers / infiniband / core /). < br> Но, наконец, в основном он будет использовать инфраструктуру Kobject и объекты модели драйвера, такие как struct device.
Инфраструктура модели драйвера введена для устранения избыточного кода ядра и структур данных.
поэтому большинство драйверов основаны на этом, и это эффективный способ написания драйвера для Linux.

person sudheer    schedule 15.06.2018