Android的init进程是如何启动的
来源:互联网 发布:淘宝客服速成 编辑:程序博客网 时间:2024/05/21 11:30
这里我就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进程了,写的比较的粗略,具体的细节还是需要自己去看代码体会。
- Android的init进程是如何启动的
- Android启动的init进程
- android init进程启动的大致流程
- Android的init进程启动过程
- Android的init启动进程分析
- android init.rc中启动的service 默认是disable的,后续如何启动此服务
- android init.rc中启动的service 默认是disable的,后续如何启动此服务
- android init.rc中启动的service 默认是disable的,后续如何启动此服务
- Android启动流程分析(二) init进程的启动
- Android的init进程
- android 的Init进程
- Android init进程启动
- Android init进程启动
- Android init进程启动
- Android init进程启动
- Init进程启动Zygote进程的过程
- 浅析kernel启动的第1个用户进程init如何解读init.rc脚本
- 浅析kernel启动的第1个用户进程init如何解读init.rc脚本
- Java的多线程编程模型5--从AtomicInteger开始
- Java的GC工作原理
- 在Eclipse中配置google protobuf
- python+3+打印所有汉字
- 电机控制应用于医疗电子设备
- Android的init进程是如何启动的
- 【javascript】JS判断是否为数字,是否为整数,是否为浮点数
- LOCAL_PRELINK_MODULE和prelink-linux-arm.map
- 如何将openCRX数据从HSQLDB迁移到其他数据库
- CLR_VIA_C# 数组
- Android+OTA+升级之一:编译升级包---make+otapackage
- 软件公司如何才能留住员工
- 【java】下载word把word另存为jsp然后上面加上以下代码
- JAVA设计模式-Decorator