Ответ 1
Отличие относится к срокам или, точнее, порядку исполнения. То есть процедура, объявленная как subsys_initcall
, должна быть выполнена до процедуры, объявленной как module_init
. Это упорядочение гарантирует, что драйверы подсистем и платформ инициализируются до того, как драйверы устройств попытаются использовать прежнюю функциональность (например, драйвер устройства регистрируется как устройство подсистемы).
Фактическое определение макроса для каждого зависит от того, настроено ли ядро для (загружаемых) модулей или нет. Определение этих макросов (и других макросов init) можно найти в include/linux/init.h
Обратите внимание, что subsys_initcall()
может использоваться только встроенным (статически связанным) модулем. module_init
может использоваться либо встроенными, либо загружаемыми модулями.