2013-03-21 1 views
13

В чем разница между module_init и subsys_initcall при инициализации драйвера?В чем разница между module_init и subsys_initcall при инициализации драйвера?

+0

Вы проверили страницы руководства? – rekire

+1

Для этого недоступна запись на странице руководства. – kzs

+1

Вы всегда можете использовать grep через источники. Многое можно объяснить, просто взглянув на источники. –

ответ

17

Разница относится к срокам или, точнее, порядку исполнения. То есть, процедура, объявленная как subsys_initcall, гарантируется, чтобы выполнить процедуру, объявленную как module_init. Это упорядочение гарантирует, что драйверы подсистем и платформ инициализируются до того, как драйверы устройств попытаются использовать функции прежнего (например, драйвер устройства регистрируется как устройство подсистемы).

Фактическое определение макроса для каждого зависит от того, настроено ли ядро ​​для (загружаемых) модулей или нет. Определение этих макросов (и других макросов инициализации) можно найти в include/linux/init.h

Обратите внимание, что subsys_initcall() может использоваться только встроенным (статически связанным) модулем.
module_init может использоваться либо встроенными, либо загружаемыми модулями.

+0

Очень понятно .. спасибо .. – kzs

+2

Для загружаемых модулей '* .ko'' subsys_initcall() 'сопоставляется с' module_init() 'ie' device_initcall() 'Ссылка: http : //lxr.free-electrons.com/source/include/linux/init.h#L298 – TheCodeArtist