Изменение порядка загрузки Linux модуля ядра - PullRequest
1 голос
/ 25 мая 2020

Я экспериментирую с оптимизацией загрузки на своей встроенной системе Linux на основе Raspberry Pi 4 - Yocto и хочу установить, когда загружается модуль ядра vc4-drm.

Я бы хотел, чтобы модуль ядра vc4-drm загружался раньше, чтобы / dev / fb0 был готов раньше. Теперь оно превышает время загрузки моего пользовательского пространства, поэтому я не могу ничего отображать на нем в течение примерно 9 секунд. Однако, если я переместу его так, чтобы он инициализировался раньше, думаю, будет лучше.

Ниже приведено изображение, на котором показаны основные модули ядра, загруженные в мою систему, в режиме полной отладки (загрузочная диаграмма + initcall_debug + serial + printk включен). Вы увидите, что vc4_drm_register почти подошел к концу.

enter image description here

Чтобы подойти к проблеме, я обнаружил следующее: 1042 * порядок загрузки встроенного драйвера? и Как Linux определяет порядок вызовов инициализации модуля? . Ясуси Сёдзи заявляет:

поместите вашу функцию инициализации на более высокий уровень или поместите драйвер устройства на более высокую позицию в Makefile

Для первого метода , в ядре, которое я компилирую, я нашел модуль в drivers/gpu/drm/vc4, затем заменил module_init(vc4_drm_register) на early_initcall(vc4_drm_register) и subsys_initcall(vc4_drm_register). Обе попытки не имели абсолютно никакого значения, vc4 по-прежнему загружается примерно на 9 секунде. Либо мне здесь чего-то не хватает, либо это обрабатывается по-другому.

Второй способ - это отрегулировать порядок в драйверах / Makefile. Однако мне кажется, что gpu / drivers уже довольно ранняя стадия.

obj-y               += irqchip/
obj-y               += bus/

obj-$(CONFIG_GENERIC_PHY)   += phy/

# GPIO must come after pinctrl as gpios may need to mux pins etc
obj-$(CONFIG_PINCTRL)       += pinctrl/
obj-$(CONFIG_GPIOLIB)       += gpio/
obj-y               += pwm/

obj-y               += pci/

obj-$(CONFIG_PARISC)        += parisc/
obj-$(CONFIG_RAPIDIO)       += rapidio/
obj-y               += video/
obj-y               += idle/

# IPMI must come before ACPI in order to provide IPMI opregion support
obj-y               += char/ipmi/

obj-$(CONFIG_ACPI)      += acpi/
obj-$(CONFIG_SFI)       += sfi/
# PnP must come after ACPI since it will eventually need to check if acpi
# was used and do nothing if so
obj-$(CONFIG_PNP)       += pnp/
obj-y               += amba/

obj-y               += clk/
# Many drivers will want to use DMA so this has to be made available
# really early.
obj-$(CONFIG_DMADEVICES)    += dma/

# SOC specific infrastructure drivers.
obj-y               += soc/

obj-$(CONFIG_VIRTIO)        += virtio/
obj-$(CONFIG_XEN)       += xen/

# regulators early, since some subsystems rely on them to initialize
obj-$(CONFIG_REGULATOR)     += regulator/

# reset controllers early, since gpu drivers might rely on them to initialize
obj-$(CONFIG_RESET_CONTROLLER)  += reset/

# tty/ comes before char/ so that the VT console is the boot-time
# default.
obj-y               += tty/
obj-y               += char/

# iommu/ comes before gpu as gpu are using iommu controllers
obj-$(CONFIG_IOMMU_SUPPORT) += iommu/

# gpu/ comes after char for AGP vs DRM startup and after iommu
obj-y               += gpu/
# ...
# ...
# ...
# Continues with a lot more drivers here...

Поэтому мне нужна помощь, чтобы разобраться в этом. Как мне убедиться, что vc4 загружен раньше, чем сейчас? Если мне что-то не хватает, дайте мне знать. Большое спасибо.

ПРИМЕЧАНИЕ: vc4-drm dmesg

root@raspberrypi4-64:~# dmesg | grep vc4                                            
[    9.123494] calling  vc4_drm_register+0x0/0x1000 [vc4] @ 299                     
[    9.184440] vc4-drm soc:gpu: bound fe600000.firmwarekms (ops vc4_fkms_ops [vc4]) 
[    9.192810] [drm] Initialized vc4 0.0.0 20140616 for soc:gpu on minor 1          
[    9.380513] vc4-drm soc:gpu: fb0: DRM emulated frame buffer device               
[    9.393112] initcall vc4_drm_register+0x0/0x1000 [vc4] returned 0 after 187677 us
ecs 

1 Ответ

1 голос
/ 26 мая 2020

Мне удалось решить проблему. Получается, что для того, чтобы *_initcall() работал, модуль должен быть статически связан, поэтому я установил;

CONFIG_DRM_VC4=y
CONFIG_SND=y
CONFIG_SNC_SOC=y

Это теряет пару миллисекунд времени загрузки, но теперь / dev / fb0 загружается примерно через ~ 0,3 секунды, а не за ~ 9 секунд.

...