Linux內(nèi)核為不同驅(qū)動的加載順序?qū)?yīng)不同的優(yōu)先級,定義了一些宏:
includelinuxinit.h
#define pure_initcall(fn)?? __define_initcall("0",fn,1)
#define core_initcall(fn)?? __define_initcall("1",fn,1)
#define core_initcall_sync(fn)?? __define_initcall("1s",fn,1s)
#define postcore_initcall(fn)?? __define_initcall("2",fn,2)
#define postcore_initcall_sync(fn) __define_initcall("2s",fn,2s)
#define arch_initcall(fn)?? __define_initcall("3",fn,3)
#define arch_initcall_sync(fn)?? __define_initcall("3s",fn,3s)
#define subsys_initcall(fn)?? __define_initcall("4",fn,4)
#define subsys_initcall_sync(fn) __define_initcall("4s",fn,4s)
#define fs_initcall(fn)??? __define_initcall("5",fn,5)
#define fs_initcall_sync(fn)?? __define_initcall("5s",fn,5s)
#define rootfs_initcall(fn)?? __define_initcall("rootfs",fn,rootfs)
#define device_initcall(fn)?? __define_initcall("6",fn,6)
#define device_initcall_sync(fn) __define_initcall("6s",fn,6s)
#define late_initcall(fn)?? __define_initcall("7",fn,7)
#define late_initcall_sync(fn)?? __define_initcall("7s",fn,7s)
#define __initcall(fn) device_initcall(fn)
把自己的驅(qū)動的函數(shù)名用這些宏去定義之后,
就會對應(yīng)不同的加載時候的優(yōu)先級。
其中,我們寫驅(qū)動中所用到的module_init對應(yīng)的是
#define module_init(x) __initcall(x);
而
#define __initcall(fn) device_initcall(fn)
所以,驅(qū)動對應(yīng)的加載的優(yōu)先級為6
在上面的不同的優(yōu)先級中,
數(shù)字越小,優(yōu)先級越高。
同一等級的優(yōu)先級的驅(qū)動,加載順序是鏈接過程決定的,結(jié)果是不確定的,我們無法去手動設(shè)置誰先誰后。
不同等級的驅(qū)動加載的順序是先優(yōu)先級高,后優(yōu)先級低,這是可以確定的。
所以,像我們之前在驅(qū)動中用:
module_init(i2c_dev_init);
module_init(as352x_afe_init);
module_init(as352x_afe_i2c_init);
module_init(enc28j60_init);
所以,大家都是同一個優(yōu)先級去初始化,
最后這些驅(qū)動加載的順序,可以查看在根目錄下,
生成的system.map:
/****************************************************************************************************************************************************************/
研究mx53開發(fā)板上sgtl5000的音頻驅(qū)動時,發(fā)現(xiàn)有sgtl5000_i2c_driver和
imx_3stack_sgtl5000_audio_driver兩個驅(qū)動,前面的驅(qū)動總是在前面執(zhí)行,
但是好像二者都是用的module_init,那么是什么地方?jīng)Q定了它的執(zhí)行順序呢?
找到makefile內(nèi)容如下:
snd-soc-core-objs := soc-core.o soc-dapm.o soc-jack.o soc-cache.o soc-utils.o
obj-$(CONFIG_SND_SOC) += snd-soc-core.o
obj-$(CONFIG_SND_SOC) += codecs/
obj-$(CONFIG_SND_SOC) += fsl/
obj-$(CONFIG_SND_SOC) ? += imx/
obj-$(CONFIG_SND_SOC) += mxs/
sgtl5000_i2c_driver驅(qū)動是在codecs目錄下,imx_3stack_sgtl5000_audio_driver
是在imx目錄下,難道與編譯順序有關(guān)?
調(diào)整makefile中的順序后,再編譯運行,果然,二者的執(zhí)行順序變過來了。
看來如果使用同一級別的初始化,執(zhí)行順序與編譯順序有關(guān)。
?
評論