Android 系統啟動過程

kv110發表於2014-09-14

 

Android系統啟動過程由以下幾個大步驟組成:

BootRom, Bootloader, Linux Kernel, android啟動

BootRom沒有原始碼

Bootloader程式碼主要在/bootable下,包括對normal startup, recovery mode, fastboot mode的處理

Linux主要是linux kernel啟動

Androidporcess 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, LEDvibrate

Kernel:     printk, cat proc/kmsg, dmesg

Init process:  ERROR or change LOG_DEFAULT_LEVEL to 6

 

相關文章