В чем разница между register_chrdev_region и alloc_chrdev_region для выделения номеров устройств? - PullRequest
3 голосов
/ 23 марта 2012

Я хочу знать разницу между этими двумя функциями:

int register_chrdev_region(dev_t first, unsigned int count, char *name);

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name);

Ответы [ 2 ]

13 голосов
/ 23 марта 2012

См. здесь для получения подробной информации об этих двух функциях.

Регистрация действительно полезна, только если вы заранее знаете, с какого номера вы хотите начать. При регистрации вы сообщаете ядру, какие номера устройств вы хотите (начальный / младший номер и число), и оно либо дает их вам, либо нет (в зависимости от доступности).

При выделении вы сообщаете ядру, сколько номеров устройств вам нужно (начальный младший номер и число), и он найдет для вас начальный старший номер, если таковой имеется, конечно.

Частично, чтобы избежать конфликта с другими драйверами устройств, рекомендуется использовать функцию выделения, которая будет динамически назначать вам номера устройств.

Из приведенной выше ссылки:

Некоторые основные номера устройств статически назначаются наиболее распространенным устройствам. Список этих устройств можно найти в Documentation/devices.txt в дереве исходного кода ядра. Однако шансы на то, что статический номер уже назначен для использования вашего нового драйвера, невелики, а новые номера не назначаются. Так что, как писатель драйвера, у вас есть выбор: вы можете просто выбрать число, которое кажется неиспользованным, или вы можете назначать основные числа динамически.

Выбор номера может работать до тех пор, пока вы являетесь единственным пользователем вашего драйвера; как только ваш драйвер будет развернут более широко, случайное выбранное число приведет к конфликтам и неприятностям.

Таким образом, для новых драйверов мы настоятельно рекомендуем использовать динамическое распределение для получения номера вашего основного устройства, а не случайным образом выбирать число из тех, которые в настоящее время свободны. Другими словами, ваши драйверы почти наверняка должны использовать alloc_chrdev_region вместо register_chrdev_region.

Недостаток динамического назначения заключается в том, что вы не можете заранее создать узлы устройства, поскольку основной номер, назначенный вашему модулю, будет различным. Для обычного использования драйвера это вряд ли проблема, поскольку после присвоения номера вы можете прочитать его из /proc/devices.

Здесь есть связанный, но технически не дублированный вопрос здесь .

0 голосов
/ 29 апреля 2018

Согласно документу LDD3,

При настройке символьного устройства необходимо получить один или несколько номеров устройств для работы.Необходимая функция для этой задачи:

int register_chrdev_region (сначала dev_t, число без знака int, char * name);
(или)
int alloc_chrdev_region (dev_t * dev, unsigned int firstminor, unsigned int count, char * name);

Обратите внимание, что register_chrdev_region хорошо работает, если вы заранее точно знаете, какие номера устройств вам нужны,Однако часто вы не будете знать, какие основные номера будет использовать ваше устройство;в сообществе разработчиков ядра Linux постоянно предпринимаются попытки перейти к использованию динамически распределяемых номеров устройств.Ядро с радостью выделит вам основной номер на лету, но вы должны запросить это распределение, используя alloc_chrdev_region .По сути, это динамическое распределение старшего номера.

Таким образом, для новых драйверов мы настоятельно рекомендуем использовать динамическое распределение для получения номера основного устройства, а не случайным образом выбирать номер из тех, которые в настоящее время свободны.,Другими словами, ваши драйверы почти наверняка должны использовать alloc_chrdev_region, а не register_chrdev_region.

...