[Android 6.0]起動フロー分析(起動から最初のプログラムまで)

5713 ワード

概説一BootROM 二Bootloaderガイドスリーリンクスコア四initプロセス
キーパス機能五Zygote作成と起動アプリケーション
Zygoteとは何ですか?
キーコードパスプロセス分析
仮想マシンアプリを作成しますmancpp 仮想マシン初期化後、ZygoteInitjava 六System Server 七ガイド終了この記事のアドレス:http://blog.csdn.net/dearsq/article/details/53647871 転載は有名な作者Younixと出典~ありがとうございます!~
概要
このようないくつかの段階があります. 1.BootROMに電気を入れる 2.Boot Loaderガイド 3.Linuxカーネル 4.initプロセス 5.Zygote起動
展開してみると
  • 板を電気的にして、ROMに固化したコードを実行し、BootloaderをRAMにロードする.
  • Bootloaderは起動して、Linuxカーネルに入るように案内します.
  • Kernelはswapperプロセスを起動します.すなわち、idleプロセスは、pid=0であり、システム初期化過程の最初のプロセスは、プロセス管理、メモリ管理、Display、Camera Driver、Binder Driverの動作を初期化するために使用される. Kernelはinitプロセスを起動します.pid=1は、ユーザースペースの守護プロセス、HAL、起動アニメーションなどを孵化させるために使われます. Kernelはthreaddプロセス(カーネルプロセスの祖先)を開始します.pid=2は、カーネルエンジニアリングスレッドkworkder、ソフト中断スレッドなどを作成します.
  • initプロセスfork出Daemonプロセス:ueventd、logd、healthd、installd、adbd、lmkdなどのユーザー保護プロセスを孵化する. initプロセスはservicemanager、boottanimなどの重要なサービスを開始します. initプロセスはZygoteプロセスを孵化し、ZygoteプロセスはAndroidシステムの最初のJavaプロセスであり、ZygoteはJavaプロセスのすべての親プロセスであり、Zygoteプロセス自体はinitプロセスから孵化したものである.
  • ZygoteはSystem ServerとAppを孵化しました. Androidシステムのコアプロセスであり、アプリケーションライフサイクル管理、地理位置情報などの各種サービスを提供しています.
  • 次は具体的に一つ一つ分析します.
    一、BootROM
    電源を押した後、ガイドチップコードは所定の箇所(ROMに固化)から実行されます. ブート・プログラムをRAMにロードし、ブート・プログラムを実行します.
    二、Bootloaderガイドプログラム
    Bootloaderはたくさんあります.一番多いのはubootです.
    実行される機能によって、二つの段階に分けられます. 1.外部のRAMを検出し、第二段階に有用なプログラムをロードする. 2.ブートプログラムはネットワーク、メモリなどを設定します.これらはカーネルの運転に必要であり、特殊な目標を達成するためには、ブート手順は、設定パラメータまたは入力データに基づいてカーネルを設定することができる.
    コードによって二つの部分に分けられます. 1.init.S初期化スタック、BSSセグメントをクリアし、main.cの_を呼び出します.main関数 2.main.cはハードウェア(アラーム、マザーボード、キーボード、コンソール)を初期化し、linuxラベルを作成します.
    三、Linuxカーネル
    カーネル起動時には、キャッシュ、被保護メモリ、計画リストを設定し、駆動をロードします.カーネルがシステム設定を完了すると、まずシステムファイルの中から「init」ファイルを探して、次にrootプロセスまたはシステムの最初のプロセスを開始します.
    ケネルの入り口はstextで、これはアセンブリ関数です. stextからケネルは、アセンブリ言語によるチップレベルの初期化作業を行い、静的な定義でケネルの最初のケネルプロセスinit_を作成します.task、すなわち0番プロセスです. そして、ケネルの最初のc言語関数start_にジャンプします.ケネルは後続の非常に複雑なケネル初期化作業を完成しました. レストにいるinitでケネルの二つ目のケネルプロセスを作成しました.init(1番プロセス)と2番目のケネルプロセスkthreadd(2番プロセス)は、駆動工程にとって、ケネル(u)に注目する必要があります.init呼び出しのドゥドゥbaic_システムドライバ初期化が完了したセットアップ関数. 最後にケネルinitはrun_を呼び出しますinit_process(「/init」)は、initプログラムの実行を開始し、ケネルプロセスから最初のユーザプロセスに移行します.
    参考:Kernel起動プロセスのソースコードのまとめ
    四、initプロセス
    initプロセスは、Linuxシステムにおけるユーザ空間の最初のプロセスであり、プロセス番号は1である. これはユーザープロセスの祖先です.
    キーパス
    initプロセス/system/core/init init.rcシナリオ/system/core/rootdir/init.rc readme.txt/system/core/init/readme.txt
    作用
  • すべてのinit.rcファイルを分析して実行します./parser.PaseConfig("/init.rc")
  • は、デバイス駆動ノードを生成する.(rcファイルで作成)
  • は、サブルーチンの終了を処理する(signal方式).
  • は属性サービスを提供します./startpropertyservice()
  • Zygoteを作成します. 5.1解析init.zygote.rc/parse_service() 5.2 mainタイプのサービスを開始する/douクラスstart() 5.3 zygoteサービスを開始する/service_start() 5.4 Zygote作成プロセス/fork() 5.5 Zygote Socketを作成する/create_socket()
  • init.rcで起動するアクションとService: on early-int:initプロセスとその作成したサブプロセスの優先度を設定し、initプロセスの安全環境を設定します. on init:グローバル環境を設定し、cpu accountingのためにcgroup(リソース制御)マウントポイントを作成します. on fs:マウントmtdパーティション on post-fs:システムディレクトリのアクセス権限を変更します. on post-fs-data:変更/dataディレクトリとそのサブディレクトリのアクセス権限 on boot:基本ネットワークの初期化、メモリ管理など service servicemanager:システムマネージャを起動して、位置、オーディオ、Shared preferenceなどのすべてのローカルサービスを管理します. service zygote:zygoteをアプリケーションとして起動します.
    参考:AndroidのInitプロセス 参考:Androidシステム起動-init編
    五、Zygote作成と起動アプリケーション
    Zygoteとは何ですか
    Zygoteは名前の通り、Android応用のすべての祖先です.
    最初に、Javaでは、異なる仮想マシンのインスタンスが、異なるアプリケーションのために異なるメモリを割り当てることができる.しかし、Androidシステムが各アプリケーションのために異なるVMインスタンスを起動すると、メモリと時間が大量に消費される.この問題を克服するために、Androidシステムは「Zygote」を作成しました.
    ZygoteはVM共有コード、低メモリ占有および最小起動時間を可能にします. Zygoteは仮想マシンプロセスです.前のステップで言ったようにシステムガイドの時に起動します.Zygoteプリロードおよびコアライブラリクラスを初期化します.通常、これらのコアクラスは読み取り専用であり、Android SDKまたはコアフレームの一部でもある.Java仮想マシンでは、各インスタンスには、自身のコアライブラリタイプのファイルとオブジェクトのコピーがあります.
    キーコードパス
    フレームワーク層
    App_main.main
        AndroidRuntime.start
            startVm
            startReg
            ZygoteInit.main
                registerZygoteSocket
                preload
                startSystemServer
                runSelectLoop
    1 2 3 4 5 6 7 8 9 プロセス分析
    Zygoteは、initプロセスがinit.zygote.rcファイルを解析して作成したもので、zygoteに対応する実行可能プログラムap_process、対応するソースファイルはアプリです.main.cpp,プロセス名はzygoteです.
    仮想マシンを作成します.main.cpp
  • は、まずAndroid dRuntimeから引き継がれたAppRuntimeオブジェクトを生成し、このクラスは初期化されてVMを実行し、Androidアプリケーションを実行する準備ができている.Android Runtime.start メール関数で渡されたパラメータを受け入れると、-Xzygote/system/bin–zygote–start-system-serverが仮想マシン
  • を初期化します.
  • startVMです.JNI_を呼び出しますCreateJavaVMは仮想マシンを作成します.
  • startReg.JNI関数登録
  • 仮想マシン初期化後/ZygoteInit.java
    ZygoteInitコードフロー: 1.ソケットをバインドします.Activity Managerからのアプリケーション起動要求を受け付けます. 2.Android Frame eworkの中のclass、resをメモリにロードします. Androidは、Zygoteが作成されたときにリソースをロードし、情報リンクを生成し、またアプリケーションが起動し、fork子プロセスと親プロセスが情報を共有することで、新たにロードする必要がなく、VMも共有する. 3.System Serverを起動します.私たちのアプリケーションの起動にはこれらのserverの参加が必要ですので、先にSystem Serverを起動する必要があります.続いてServerThreadを起動してAndroid Frame eworkサービスを実行し、JNIを通じてContect Managerに登録します. 4.ZygoteはポーリングでSocketを傍受しています.要求が到着したら、リクエストを読み取り、forkサブルーチンを読み込み、プロセスに必要なクラスをロードして、実行するプログラムのMainを実行します.コードはVMに転送され、Appも起動しました.次にZygoteはソケットを閉じて、要求記述子を削除して、重複起動を防止します.
    参照 Androidシステム起動-zygote編
    六、SystemServer
    Zygote起動中にstartSystem Server()を呼び出します.startSystem Server()の関数はsystem_です.server起動フローの起点、起動フローチャートは以下の通りです. 
    system_serverプロセスは、ソースの角度からガイドサービス、コアサービス、その他のサービスの3つに分類されます. ガイドサービス(7つ):ActivityManagerService、パワーManagerService、Lights Service、DisplayManagerService、Package ManagerService、UserManager Service; コアサービス(3つ):BatteryService、UsageStats Service、WebView UpdateService; その他のサービス(70個+):AlarmManagerService、Vibrate Serviceなど.