Как статически собрать модуль ядра с помощью buildroot?

Есть ли где-нибудь пример пакета о том, как вы могли бы статически скомпилировать драйвер устройства?

Я знаю, что obj-y используется для статической компиляции по сравнению с obj-m. У меня есть динамически загружаемый модуль, который создается в моем пакете buildroot прямо сейчас. Этот динамический модуль работает именно так, как я и ожидал. Я даже понял, что могу изменить make-файл модуля, чтобы использовать obj-y, и добавить параметр buildroot, где, если я нажму на него, он добавит строку в drivers/Makefile. Вывод показал, что мой модуль построен. Но мне совсем не показалось, что функция инициализации моего драйвера выполняется при запуске, потому что я не вижу файл своего устройства в /dev.


person Adam Miller    schedule 22.01.2016    source источник
comment
Проблема в вашем драйвере. Возможно, порядок инициализации неправильный при компиляции. И, похоже, вы не сделали домашнее задание, то есть не проверили, как отлаживать вызовы init в документации ядра.   -  person 0andriy    schedule 23.01.2016
comment
У меня это работает полностью, я отвечу на свой вопрос постом к примеру.   -  person Adam Miller    schedule 23.01.2016
comment
Динамический внешний модуль ядра: stackoverflow.com/questions/40307328/   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 23.06.2017


Ответы (2)


Предположим, у вас есть драйвер в driver.c и пакет buildroot с именем STATICDRVR, вы можете использовать следующие файлы Config.in и STATICDRVR.mk для добавления статического модуля, который будет собран при сборке ядра:

Config.in

config BR2_PACKAGE_STATICDRVR
       bool "Build & link static driver?"
       help
         This is a driver that blah blah greatness whatever

STATICDRVR.mk

STATICDRVR_VERSION = master
STATICDRVR_SITE =  /location/to/STATICDRVR_containing_src
STATICDRVR_SITE_METHOD = local
STATICDRVR_MODULE_SUBDIRS = src
STATICDRVR_INSTALL_TARGET = YES
STATICDRVR_LICENSE = GPLv2
STATICDRVR_LICENSE_FILES = COPYING
STATICDRVR_NAME = STATICDRVR

STATICDRVR_DEPENDENCIES = linux


define STATICDRVR_BUILD_CMDS
    #make sure that obj-y += STATICDRVR/ is only in the build makefile once
    sed -i '/obj-y += STATICDRVR/d' $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/Makefile
    echo "obj-y += STATICDRVR/" >> $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/Makefile
    rm -rf $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/STATICDRVR
    cp -r $(@D)/src $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/STATICDRVR
    echo "obj-y += driver.o" > $(BUILD_DIR)/linux-$(LINUX_VERSION)/drivers/STATICDRVR/Makefile
endef

define STATICDRVR_INSTALL_STAGING_CMDS
endef


define STATICDRVR_INSTALL_TARGET_CMDS
endef

endif

define STATICDRVR_DEVICES
endef

define STATICDRVR_PERMISSIONS
endef

define STATICDRVR_USERS
endef

$(eval $(kernel-module))
$(eval $(generic-package))
person Adam Miller    schedule 30.01.2016
comment
Вместо этого я бы предоставил файл .patch и применил его. - person Ciro Santilli 新疆再教育营六四事件ۍ 04.08.2016

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

person Arnout    schedule 24.01.2016
comment
Я приведу пример, я решил свою проблему. Технически вы правы, но, вероятно, будет полезнее признать, что я имею в виду, что у меня есть код драйвера, и я хочу, чтобы он был статически связан с ядром, потому что я знаю лучше, чем думать, что файл .ko может быть статически связан с ядром. файл вмлинукс. - person Adam Miller; 24.01.2016
comment
Связано: stackoverflow.com/questions/7353851/ - person Ciro Santilli 新疆再教育营六四事件ۍ 04.08.2016