android起動のサブシステム切り替え


出典:http://blog.csdn.net/xl19862005
1、総説
Androidシステムにはいくつかのサブシステムがありますが、これらのサブシステムはどのようにメインシステムと切り替わりますか?
(recoveryシステムの切り替えと起動はもう別のブログに書いてあります.
http://blog.csdn.net/xl19862005/article/details/8517918
)
今日はfactoryというサブシステムの起動過程を整理しましたが、下記のように記録します.
現在使用されているプラットフォームスキームはMTKの6572ですので、コードパスなどは他の方式とは異なります.
まず図を見てみます.
android启动之子系统切换_第1张图片
factoryサブシステムに入るとrecoveryシステムとは違っています.
factory:initというプロセスでアクティブにして起動します.
recovery:bootcmdlineを通じて該当するアドレスにジャンプして起動する2、lk(ubrot)によってfactory mlt keyを検出します.
このファイルには次のコードがあります.
BOOL factory_check_key_trigger(void)
{
	//wait
	ulong begin = get_timer(0);
	printf("
%s Check factory boot
",MODULE_NAME); printf("%s Wait 50ms for special keys
",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
",MODULE_NAME); printf("%s Enable factory mode
",MODULE_NAME); g_boot_mode = FACTORY_BOOT; //video_printf("%s : detect factory mode !
",MODULE_NAME); return TRUE; } } return FALSE; }
factory keyが押下されたことが検出された場合、ここに設定されます.
<span style="color:#ff0000;">g_boot_mode = FACTORY_BOOT;</span>
g_ブット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、ケネルでinitプロセスを起動する
lkがカーネルを導いた後、私達はケネル/init/main.cnの中でこのファイルのケネルを見に来ました.initという関数は、スレッドレス関数です.
同じ文書の中のレスinit関数で
    ケネルthread(ケネルクィーニ、NULL、CLONEKUFS|CLONEKUSIGHAND);
スレッドに登録して実行します.
ケネルにいます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
", ramdisk_execute_command); }
ここでカーネルがユーザ空間に入るプログラムを案内します.
また、mediatek/plotform/mt 6572/ケネル/core/mt_このファイルには以下のコードがあります.
    /* create proc entry at /proc/boot_mode */
create_proc_read_entry(boot_mode, S_IRUGO, NULL, boot_mode_proc, NULL);
はここで「boot moode」という属性を作成しました.カーネルとユーザ空間の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
", "/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
"); return 0; } // Factory Mode, '4' // ATE Factory Mode, '6' if ((boot_mode != '4') && (boot_mode != '6')){ ERROR("Unsupported factory mode
"); return 0; } printf("Factory Mode Booting.....
"); return 1; }
「/sys/class/BOOT/boot/boot/boot moode」というパスの属性ファイルはカーネルのmt_です.このファイルで作成された、initでこのファイルのプロパティを読み込み、システム起動状態を取得します.
ブックになっているのが見えますmodeが「4」に設定されている場合(前述のFACTORYuBOOT=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
"); init_parse_config_file("/factory_init.project.rc"); }
ここにfactory_をロードします.init.rcは、factoryの下で必要なサービスまたはツールのいくつかを起動するために使用されます.
また、充電機能をオフにすることも、このアーキテクチャによって実現されます.