Android的init进程是如何启动的

这里我就PXA的代码为例,说下Android系统是如何起来的,特别是Android启动的第一个进程,init进程是如何启动的。

首先uboot会通过bootargs把rdinit的所在路径传递给kernel-->

run_command("setenv bootargs rdinit=/busybox/rdinit cpmem=16M reserve_pmem=0x3000000 comm_v75 android uart_dma", 0);

可以看到红色部分即需要传递的路径地址,然而rdinit是什么呢,这里先简单说下所谓rdinit其实就是一个板级相关的脚本,里面会决定从哪启动ramdisk?nfs?mmc?等等,

那么好我们接下来看kernel里接收这个参数的函数,所在文件kernel/init/main.c

static int __init rdinit_setup(char *str)
{
 unsigned int i;

 ramdisk_execute_command = str;
 /* See "auto" comment in init_setup */
 for (i = 1; i < MAX_INIT_ARGS; i++)
  argv_init[i] = NULL;
 return 1;
}
__setup("rdinit=", rdinit_setup);

内核会把路径传递给全局变量ramdisk_execute_command,并通过

sys_access((const char __user *) ramdisk_execute_command, 0)函数执行rdinit脚本,脚本里会执行rootfs下的init,而这个init是android里的用户程序,位置在system/core/init/init.c

下面我们来简单讲下rdinit脚本,以PXA的这份rdinit为例,它做了这么几件事

1. rdinit_prepare,这个函数里主要为init进程启动作准备,mount proc sysfs等工作

2. 根据dev来判断从哪里启动,

for dev in $ROOTFS_DEV ; do
    if [ "$dev" = "flash" ]; then
        try_boot_from_ramdisk $INIT_MTDBLK
        continue
    fi
    if [ "$dev" = "nfs" ]; then
        if try_prepare_network ; then
            for type in $ROOTFS_TYPE ; do
                if [ "$type" = "android" ]; then
                    try_boot_from_android_nfs
                fi
                if [ "$type" = "generic" ]; then
                    try_boot_from_rootfs_nfs
                fi


            done
        fi
    fi
    if [ "$dev" = "mmc0" ]; then
        try_boot_from_ramdisk "$INIT_MMCBLK"0
        if [ $? = 0 ]; then
            try_boot_from_mmc 0
        fi
        continue
    fi
    if [ "$dev" = "mmc1" ]; then
        try_boot_from_ramdisk "$INIT_MMCBLK"1
        if [ $? = 0 ]; then
            try_boot_from_mmc 1
        fi
        continue
    fi
done

接下去就是跑android init进程了,写的比较的粗略,具体的细节还是需要自己去看代码体会。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值