linux - 更改 Linux 内核模块引导顺序
问题描述
我正在我的 Raspberry Pi 4(基于 Yocto 的嵌入式 Linux 系统)上尝试启动优化,并希望在加载 vc4-drm 内核模块时进行设置。
我想让 vc4-drm 内核模块更早加载,以便 /dev/fb0 更早准备好。现在,它超过了我的用户空间启动时间,因此我无法在其上显示任何内容约 9 秒。但是,如果我移动它以便更早地初始化它,我认为它会更好。
下图显示了在完整调试模式下加载到我的系统上的主要内核模块(启用了 bootchart+initcall_debug+serial+printk)。您会看到 vc4_drm_register 快要结束了。
为了解决这个问题,我发现了这些:Linux 内置驱动程序加载顺序是什么?以及Linux 如何确定模块 init 调用的顺序?. Yasushi Shoji 说;
将您的 init 函数放在较高级别,或将您的设备驱动程序放在 Makefile 中的较高位置
对于第一种方法,在我正在编译的内核中,我在 中找到了模块drivers/gpu/drm/vc4
,然后将module_init(vc4_drm_register)
两者都替换为early_initcall(vc4_drm_register)
and subsys_initcall(vc4_drm_register)
。两次尝试都没有任何区别,vc4 仍然在第 9 秒左右加载。要么我在这里遗漏了一些东西,要么处理方式不同。
建议的第二种方法是调整驱动程序/Makefile 中的顺序。但是,对我来说 gpu/驱动程序似乎已经很早了。
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
解决方案
我能够解决这个问题。事实证明,为了 make*_initcall()
的工作,模块应该是静态链接的,因此,我设置了;
CONFIG_DRM_VC4=y
CONFIG_SND=y
CONFIG_SNC_SOC=y
这会损失几毫秒的启动时间,但现在 /dev/fb0 加载时间约为 0.3 秒,而不是 9 秒。
推荐阅读
- openssl - DSO 支持例程:WIN32_BIND_FUNC:无法绑定到请求的符号名称:dso_win32.c:285:symname(bind_engine)
- azure-logic-apps - 使用 logicApp 响应 Soap
- docker - Gitlab 升级失败 - ln: 未能创建符号链接 '/opt/gitlab/service': 文件存在
- flutter - Flutter - statefulwidget 从另一个类而不是状态类扩展
- apache - 限制通过 mod_authz_svn 和 LDAP 对 Redhat IDM 服务器的 subversion 访问
- javascript - 如何获取 ES6 和 TypeScript 代码的导入图?
- crystal-lang - from_json 不适用于记录宏?
- javascript - 使用时间戳进行幂等性?
- javascript - Stripe /v1/payment_intents/:id/confirm 返回 HTTP 400 “Received unknown parameters”(Stripe Elements 和 React)
- javascript - 让循环通过json javascript数组工作