MSM8909+Android5.1.1啟動流程(5)---app_init()
調用關系
kmain()--->bootstrap2()--->apps_init()
遍歷所有在__apps_start 到__apps_end段里的函數,并調用LK中所謂的app的init函數,然后調用start_app(app),哪些app被放入 boot thread section, 則定義在 include/app.h 中的 APP_START(appname),app.h文件中相干定義:
#define APP_START(appname) structapp_descriptor _app_##appname __SECTION(".apps") = { .name =#appname,
#define APP_END };
aboot_init 就將在這里開始被運行,androidlinux 內核的加載工作就在 aboot_init 中完成的 。aboot.c中的定義以下:
APP_START(aboot)
.init= aboot_init,
APP_END
為了更好理解,看對應的system-onesegment.ld文件(該文件在”bootable\bootloader\lk\ build-目標平臺”目錄下),
system-onesegment.ld
原來,在其終究的連接文件里,是將需要啟動的apps括在了SECTIONS下的.rodata段中,且以__apps_start為開頭,以__apps_end標志結束(這里觸及到文件結構的部份內容,內容拓展可以看《程序員的自我修養—鏈接、裝載與庫》1書)。
正如網上所說“在 app 中只要像 app/aboot/aboot.c 指定就會在 bootloader bootup 時放入 thread section 中被履行”。這點我們可以直接在全部lk中搜索關鍵字“APP_START”會發現我們的bootloader中到底有多少個類似這樣的app(不同的bootloader情況有所不同):
圖1
可知滿足條件的app有pcitests、stringtests、tests、aboot、clocktests和shell
后面我們接著學習aboot_init()
參考:
平述factory reset ——從main system到重引導流程
http://blog.csdn.net/loongembedded/article/details/51635999
上一篇 多線程下載文件
下一篇 如何繪制caffe網絡訓練曲線