Android 系统启动过程

 

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

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值