出处:http://blog.csdn.net/xl19862005

1、总述

在android系统中有好几个子系统(recovery、factory及power off charge),那么这些子系统是如何与主系统之间进行切换的呢?

(recovery系统的切换与启动已经在另一篇博客里写过了

http://blog.csdn.net/xl19862005/article/details/8517918

今天理了一下factory这个子系统启动过程,现在将其记录如下

由于目前所用的平台方案是MTK的6572,代码路径等会和其它的方案不一样

先来看一个图:

进入factory子系统与recovery系统不同的是:

factory:是在init这个进程中激活并启动的

recovery:则是通过bootcmdline跳转到相应的地址上启动的

2、lk(uboot)检测factory mult key

在mediatek/platform/mt6572/lk/factory.c这个文件中有如下代码

BOOL factory_check_key_trigger(void)
{//waitulong begin = get_timer(0);printf("\n%s Check factory boot\n",MODULE_NAME);printf("%s Wait 50ms for special keys\n",MODULE_NAME);/* If the boot reason is RESET, than we will NOT enter factory mode. */if(mtk_detect_pmic_just_rst()){return false;}while(get_timer(begin)<50){    if(mtk_detect_key(MT65XX_FACTORY_KEY)){  printf("%s Detect key\n",MODULE_NAME);printf("%s Enable factory mode\n",MODULE_NAME);       g_boot_mode = FACTORY_BOOT;//video_printf("%s : detect factory mode !\n",MODULE_NAME);return TRUE;}} return FALSE;
}

当检测到factory key按下时会在这里设置

<span style="color:#ff0000;">g_boot_mode = FACTORY_BOOT;</span>

g_boot_mode是一个typedef类型的全局变量

类型定义如下:

typedef enum
{NORMAL_BOOT = 0,META_BOOT = 1,RECOVERY_BOOT = 2,    SW_REBOOT = 3,FACTORY_BOOT = 4,ADVMETA_BOOT = 5,ATE_FACTORY_BOOT = 6,ALARM_BOOT = 7,
#if defined (MTK_KERNEL_POWER_OFF_CHARGING)KERNEL_POWER_OFF_CHARGING_BOOT = 8,LOW_POWER_OFF_CHARGING_BOOT = 9,
#endif    FASTBOOT = 99,DOWNLOAD_BOOT = 100,UNKNOWN_BOOT
} BOOTMODE;

可以看出这里定义的FACTORY_BOOT模式的值为4! 3、kernel中启动init进程

lk(uboot)引导内核之后,我们来看看在kernel/init/main.c中这个文件中的kernel_init这个函数,这是一个线程回调函数,

在同文件中的rest_init函数中

kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);

注册到线程中去并得到执行

在kernel_init中有如下代码:

    if (!ramdisk_execute_command)ramdisk_execute_command = "/init";if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {ramdisk_execute_command = NULL;prepare_namespace();}

可以看出这里将/init这个根目录中的bin文件路径传递给了ramdisk_execute_command这个全局的字符指针,另外根目录中的init bin文件是

打包到ramdisk.img中的(请查看android源码编译后相应的root目录下的文件)

再来看看init_post这个函数中的如下代码:

    if (ramdisk_execute_command) {run_init_process(ramdisk_execute_command);printk(KERN_WARNING "Failed to execute %s\n",ramdisk_execute_command);}

在这里内核就引导进入到用户空间的程序了

另外在mediatek/platform/mt6572/kernel/core/mt_boot.c这个文件中有如下代码:

    /* create proc entry at /proc/boot_mode */
create_proc_read_entry(boot_mode, S_IRUGO, NULL, boot_mode_proc, NULL);

在这里创建了一个名为“boot_mode”的属性,用于内核和用户空间的init程序传递参数!

4、init进程 system/core/init/init.c

这是生成根目录中init bin的源码

在这个文件的main函数中对系统启动所需的各种资源进行了准备和初始化……

这里有如下代码:

static int is_factory_boot(void)
{int fd;size_t s;char boot_mode;fd = open("/sys/class/BOOT/BOOT/boot/boot_mode", O_RDWR);if (fd < 0) {printf("fail to open: %s\n", "/sys/class/BOOT/BOOT/boot/boot_mode");return 0;}s = read(fd, (void *)&boot_mode, sizeof(boot_mode));close(fd);if(s <= 0){ERROR("could not read boot mode sys file\n");return 0;}// Factory Mode, '4'// ATE Factory Mode, '6'if ((boot_mode != '4') && (boot_mode != '6')){ERROR("Unsupported factory mode\n");return 0;}printf("Factory Mode Booting.....\n");return 1;
}

"/sys/class/BOOT/BOOT/boot/boot_mode"这个路径的属性文件是在内核中的mt_boot.c这个文件中创建的,在init中读取这个文件的属性从而获得系统启动状态

可以看出当boot_mode被设置成“4”时(对应前面提到的FACTORY_BOOT = 4)就会进入到factory子系统了

    if (is_factory_boot()){ERROR("This is factory boot");property_set("sys.mtk.no.factoryimage","1");init_parse_config_file("/factory_init.rc");INFO("reading project config file\n");init_parse_config_file("/factory_init.project.rc");}

在这里加载factory_init.rc用于启动factory下所需的一些服务或工具。

另外关机充电功能的实现也是按照这种架构实现的!

android启动之子系统切换相关推荐

  1. Android Framework 电源子系统(01)PowerManagerService启动分析

    该系列文章总纲链接:专题分纲目录 Android Framework 电源子系统 本章关键点总结 & 说明: 本章节主要关注➕ 以上思维导图即可.该章节 主要是 对 PMS 启动的分析,从sy ...

  2. WIN11 安卓子系统无法启动解决办法 无法启动适用于 Android 的 Windows 子系统 确保在可选的Windows功能中启用虚拟机平台

    在win11的系统中打开安卓子系统报错如下: 无法启动适用于 Android 的 Windows 子系统 确保在可选的Windows功能中启用虚拟机平台 在尝试了网上其他办法,如"打开 BI ...

  3. WSA安卓子系统最新版下载直链:微软已更新至1.8.32822.0版本适用于Android的Windows子系统无需切换美区和Beta通道

    WSA安卓子系统最新版直连下载链接:微软已更新至V1.8.32822.0版本适用于Android的Windows子系统无需切换美区和Beta通道 ​ 01 引言 优爱酷在10月份微软刚刚发布安卓子系统 ...

  4. Android Framework 窗口子系统 (08)窗口动画之动画系统框架

    该系列文章总纲链接:专题分纲目录 Android Framework 窗口子系统 本章关键点总结 & 说明: 导图是不断迭代的,这里主要关注➕ 左上角 Android 窗口动画系统部分(因为导 ...

  5. android 模拟器横竖屏切换

    android 模拟器横竖屏切换 今天在做android实验的时候,由于遇到要横竖屏切换,所以去网上找了一下这样的方法: 找到以下方法: 1.通过ctrl  +  F11  或者  ctrl  +   ...

  6. Android系统(121)---Android启动页黑屏及最优解决方案

    Android启动页黑屏及最优解决方案 前言 相信做过Android的朋友都知道,当一个APP启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页.那么这个黑屏或者白屏 ...

  7. Android 系统(119)---Android启动页黑屏及最优解决方案

    Android启动页黑屏及最优解决方案 前言 相信做过Android的朋友都知道,当一个APP启动时,界面会首先展示一个白屏或者黑屏,然后再进入欢迎页,稍作停留最后进入APP主页.那么这个黑屏或者白屏 ...

  8. android最优化启动画面,Android启动页黑屏及最优解决方案

    原标题:Android启动页黑屏及最优解决方案 作者:拉丁吴 链接:https://juejin.im/post/58ad90518ac2472a2ad9b684 前言 相信做过Android的朋友都 ...

  9. Android Framework 电源子系统(05)核心方法updatePowerStateLocked分析-3 更新屏保  发送通知  更新wakelock

    该系列文章总纲链接:专题分纲目录 Android Framework 电源子系统 本章关键点总结 & 说明: 本章节主要关注➕ updatePowerStateLocked 方法中 更新屏保 ...

  10. android 启动页主题_如何使用主题和启动器个性化您的Android手机

    android 启动页主题 Android's customizability is one reason many people prefer it. You can change the look ...

最新文章

  1. OneGame V1.0.2 发布,让运营游戏不再是梦想
  2. ARM+linux+2440嵌入式开发相关经典书籍(转)
  3. 用maven搭建 testNG+PowerMock+Mockito测试框架
  4. 实现深拷贝的几种方法
  5. set、vector与list的构造与排序的耗时测试
  6. OpenGL基础8:SOIL库
  7. Salesforce删除数据时出现Insufficient privileges的可能原因
  8. 数据-第8课-线性表的链式存储结构(未)
  9. 分布式 Git - 为项目做贡献
  10. 马尔科夫蒙特卡罗方法
  11. 高德地图api汇总(二)插件的使用
  12. php网站整合ck播放器,网页视频播放器-ckplayer 整合到wordpress
  13. 网上银行系统5:系统登陆
  14. PHP给title=赋值变量 PHP title弹出字符串拼接变量
  15. 用pandas读写HDF5文件
  16. IM1253B交直流电能计量模块(艾锐达光电)
  17. 小红书笔记如何发布内容
  18. HM数据科学库-matplotlib(二)
  19. Windows Embedded CE和Windows Mobile下ActiveSync开发
  20. 非计算机专业人员的程序之路

热门文章

  1. JS 逻辑中断(一)
  2. 如何用iMazing备份和恢复辐射避难所
  3. Redis中的lru算法实现
  4. MongoDB 和 mySql 的关系
  5. ubuntu 14.04英文环境设置成中文
  6. FDQuery 怎么能插入NULL参数
  7. 常见的SQL错误和解决方法
  8. 在html或asp.net中使用FlexPaper
  9. 过滤DataTable中的指定字段重复的行
  10. Win9x 与 WinME 磁盘共享密码破解实战