關(guān)于內(nèi)核啟動流程涉及內(nèi)容較多而且復(fù)雜,過度的分析意義不大,因此,這里不做詳細(xì)講解,只做一個大概的介紹。初學(xué)者只做了解,有一定基礎(chǔ)的可以深入理解。
內(nèi)核鏡像被uboot加載到內(nèi)存空間之后,獲得控制權(quán),內(nèi)核啟動流程開始。在前面章節(jié)講解zImage生成過程的時候說過內(nèi)核鏡像image是被壓縮進zImage之中的。所以,內(nèi)核獲得控制權(quán)之后,第一件事,是解壓縮內(nèi)核鏡像。解壓縮工作由arch/arm/boot/compressed/head.S完成,head.S在解壓完zImage之后將生成的image鏡像重定位到內(nèi)核入口地址0X80008000,并跳轉(zhuǎn)到此處執(zhí)行image。
打開arch/arm/kernel/vmlinux.lds可以找到內(nèi)核入口ENTRY(stext):
而stext存在于arch/arm/kernel/head.S中:
在stext下有一個__mmap_switched函數(shù):
該函數(shù)存在于arch/arm/kernel/head-common.S,其中有一句跳轉(zhuǎn)指令:b start_kernel
從start_kernel函數(shù)開始,內(nèi)核進入C語言部分,完成內(nèi)核的大部分初始化工作。start_kernel函數(shù)存在于init/Main.c中:
函數(shù)在最后調(diào)用rest_init函數(shù):
此函數(shù)中調(diào)用了kernel_init函數(shù),kernel_init函數(shù)完成了設(shè)備驅(qū)動程序的初始化,并啟動了用戶進程: