Android 系統啟動過程
Android系統啟動過程由以下幾個大步驟組成:
BootRom, Bootloader, Linux Kernel, android啟動
BootRom沒有原始碼
Bootloader程式碼主要在/bootable下,包括對normal startup, 及recovery mode, fastboot mode的處理
Linux主要是linux kernel啟動
Android從porcess init (process 1)開始,帶動其他process/service啟動
下面主要講Bootloader 及linux呼叫過程
1.Bootloader呼叫過程
kernel/arch/arm/crt0.S _start call kmain() in bootable/bootloader/lk/kernel/main.c
kmain() 依次呼叫
thread_init_early()
arch_early_init()
platform_early_init()
target_early_init()
bs_set_timestamp()
call_constructors()
heap_init()
thread_init()
dpc_init()
timer_init()
create thread bootstrap2
其中 target_early_init() 定義在 bootable/bootloader/lk/target/msm8226/init.c ,會對uart初始化 uart_dm_init(1, 0, BLSP1_UART2_BASE);
bootstrap2() 又會呼叫
arch_init()
platform_init()
target_init()
apps_init()
target_init()定義在具體平臺下,通常初始化些用到匯流排,keyboard, display等
apps_init() 定義在 bootable/bootloader/lk/app/app.c ,會呼叫bootable/bootloader/lk/app/aboot/aboot.c 裡的 aboot_init()
aboot_init() 首先判斷按鍵是recovery mode還是fastboot mode.
如果是fastboot mode,則呼叫fastboot_init() ,該函式定義在bootable/bootloader/lk/app/aboot/fastboot.c。
如果是正常啟動模式或recovery模式,則呼叫
emmc_recovery_init())
boot_linux_from_mmc()
boot_linux_from_mmc()定義在recovery/normal mode bootable/bootloader/lk/app/aboot/aboot.c
首先根據不同模式讀出/boot, /recovery分割槽索引及偏移,接著會呼叫boot_linux() 進入linux kernel.
2. Kernel啟動呼叫過程
進入linux kernel首先是解壓縮zimage,初始化MMU等硬體,進入到start_kernel()
是由kernel/arch/arm/kernel/head-common.S裡的__INIT呼叫過來
start_kernel()定義在 kernel/init/main.c,會呼叫
boot_cpu_init();
page_address_init();
mm_init_owner(&init_mm, &init_task);
mm_init_cpumask(&init_mm);
setup_command_line(command_line);
setup_nr_cpu_ids();
setup_per_cpu_areas();
smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
setup_log_buf(0);
vfs_caches_init_early();
mm_init();
sched_init();
…….
rest_init();
rest_init() create two threads,
在第一個執行緒執行函式kernel_init(),
if (!ramdisk_execute_command)
ramdisk_execute_command = "/init";
接著呼叫init_post(),
run_init_process(ramdisk_execute_command);
->kernel_execve
-> do_execve
process init就這樣被建立了
3. 除錯
Bootloader除錯:
串列埠,T32, 寫到檔案裡,列印到螢幕,設定硬體(GPIO, LED,vibrate)
Kernel: printk, cat proc/kmsg, dmesg
Init process: ERROR or change LOG_DEFAULT_LEVEL to 6
相關文章
- Android系統啟動過程剖析Android
- Android系統啟動流程(四)Launcher啟動過程與系統啟動流程Android
- Android系統啟動流程(三)解析SyetemServer程式啟動過程AndroidServer
- Android系統原始碼分析--Activity啟動過程Android原始碼
- Android系統原始碼分析--Process啟動過程Android原始碼
- Linux系統啟動過程Linux
- 圖解 Android 系列(一)揭祕 Android 系統啟動過程圖解Android
- Android系統原始碼分析–Zygote和SystemServer啟動過程Android原始碼GoServer
- Android系統原始碼分析--Zygote和SystemServer啟動過程Android原始碼GoServer
- FreeBSD系統啟動過程(轉)
- 作業系統啟動的過程作業系統
- Android系統程式Zygote啟動過程的原始碼分析(3)AndroidGo原始碼
- Android App啟動過程AndroidAPP
- Android Service的啟動過程Android
- Android Activity的啟動過程Android
- Android啟動過程深入解析Android
- 關於雙系統選單,NT系統啟動過程
- Android中Activity啟動過程探究Android
- 理解 Android 程式啟動之全過程Android
- 【Android】【init】解析init程式啟動過程Android
- Android應用程式程式啟動過程Android
- Android啟動過程剖析-深入淺出Android
- 【Android原始碼】Service的啟動過程Android原始碼
- 淺析Android Activity的啟動過程Android
- Android效能優化之啟動過程(冷啟動和熱啟動)Android優化
- Android啟動過程-萬字長文(Android14)Android
- Android 系統啟動流程Android
- 【android 7.1.2】系統啟動Android
- Android輸入系統(二)IMS的啟動過程和輸入事件的處理Android事件
- 剖析Linux系統啟動的後臺全過程 (zt)Linux
- 【作業系統2】作業系統啟動過程與異常/中斷,系統呼叫作業系統
- Windows 啟動過程Windows
- Android 核心分析 之八------Android 啟動過程詳解Android
- App 啟動過程(含 Activity 啟動過程) | 安卓 offer 收割基APP安卓
- Android系統啟動自動開啟mtklogAndroid
- Android 啟動過程簡析(一)之 init 程式Android
- Android應用程式啟動過程原始碼分析Android原始碼
- Angular的啟動過程Angular