См. здесь для получения подробной информации об этих двух функциях.
Регистрация действительно полезна, только если вы заранее знаете, с какого номера вы хотите начать. При регистрации вы сообщаете ядру, какие номера устройств вы хотите (начальный / младший номер и число), и оно либо дает их вам, либо нет (в зависимости от доступности).
При выделении вы сообщаете ядру, сколько номеров устройств вам нужно (начальный младший номер и число), и он найдет для вас начальный старший номер, если таковой имеется, конечно.
Частично, чтобы избежать конфликта с другими драйверами устройств, рекомендуется использовать функцию выделения, которая будет динамически назначать вам номера устройств.
Из приведенной выше ссылки:
Некоторые основные номера устройств статически назначаются наиболее распространенным устройствам. Список этих устройств можно найти в Documentation/devices.txt
в дереве исходного кода ядра. Однако шансы на то, что статический номер уже назначен для использования вашего нового драйвера, невелики, а новые номера не назначаются. Так что, как писатель драйвера, у вас есть выбор: вы можете просто выбрать число, которое кажется неиспользованным, или вы можете назначать основные числа динамически.
Выбор номера может работать до тех пор, пока вы являетесь единственным пользователем вашего драйвера; как только ваш драйвер будет развернут более широко, случайное выбранное число приведет к конфликтам и неприятностям.
Таким образом, для новых драйверов мы настоятельно рекомендуем использовать динамическое распределение для получения номера вашего основного устройства, а не случайным образом выбирать число из тех, которые в настоящее время свободны. Другими словами, ваши драйверы почти наверняка должны использовать alloc_chrdev_region
вместо register_chrdev_region
.
Недостаток динамического назначения заключается в том, что вы не можете заранее создать узлы устройства, поскольку основной номер, назначенный вашему модулю, будет различным. Для обычного использования драйвера это вряд ли проблема, поскольку после присвоения номера вы можете прочитать его из /proc/devices
.
Здесь есть связанный, но технически не дублированный вопрос здесь .