- 论坛徽章:
- 1
|
本帖最后由 bensenq 于 2013-12-22 20:50 编辑
根据我的经验,有几点知识可以共享:
1. linux_logo 是依赖framebuffer驱动的,因此企鹅的出现肯定晚于framebuffer驱动的加载;- if FB || SGI_NEWPORT_CONSOLE
- source "drivers/video/logo/Kconfig"
- endif
复制代码 2. 如果是built-in而非模块方式,那么framebuffer驱动的加载顺序由他在编译和链接的顺序决定,即Driver/Makefile下的顺序:
- 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-y += pinctrl/
- obj-y += gpio/
- obj-y += pwm/
- obj-$(CONFIG_PCI) += 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-$(CONFIG_IPMI_HANDLER) += char/ipmi/
- obj-$(CONFIG_ACPI) += acpi/
复制代码 3. 在built-in模式而非模块方式下,module_init与device_initcall级别相同,见include/linux/init.h- #define __initcall(fn) device_initcall(fn)
- #define module_init(x) __initcall(x);
复制代码 4. device_initcall在各种initcall中的顺序在include/linux/init.h中决定:- 196#define pure_initcall(fn) __define_initcall(fn, 0)
- 197
- 198#define core_initcall(fn) __define_initcall(fn, 1)
- 199#define core_initcall_sync(fn) __define_initcall(fn, 1s)
- 200#define postcore_initcall(fn) __define_initcall(fn, 2)
- 201#define postcore_initcall_sync(fn) __define_initcall(fn, 2s)
- 202#define arch_initcall(fn) __define_initcall(fn, 3)
- 203#define arch_initcall_sync(fn) __define_initcall(fn, 3s)
- 204#define subsys_initcall(fn) __define_initcall(fn, 4)
- 205#define subsys_initcall_sync(fn) __define_initcall(fn, 4s)
- 206#define fs_initcall(fn) __define_initcall(fn, 5)
- 207#define fs_initcall_sync(fn) __define_initcall(fn, 5s)
- 208#define rootfs_initcall(fn) __define_initcall(fn, rootfs)
- 209#define device_initcall(fn) __define_initcall(fn, 6)
- 210#define device_initcall_sync(fn) __define_initcall(fn, 6s)
- 211#define late_initcall(fn) __define_initcall(fn, 7)
- 212#define late_initcall_sync(fn) __define_initcall(fn, 7s)
复制代码 综合以上信息,解决这个问题的方法大概有两种:
1. 改变FB驱动的编译连接顺序,这样可以将FB在device_initcall中的加载时间提到最前;
2. 改变FB驱动的初始化方式,即不适用module_init方式,改用arch_initcall等前几种优先级;
当然,话说回来,两种方案都是有一定风险的,因为内核这样规定加载顺序应该是有所考虑的(例如子系统之间的依赖?),需要谨慎一些。
|
|