BeagleBoard-xMの起動はイカのようになっています。
- CPUがROM内のブートコードを使って起動
- ROMのローダーがmicroSD内のMLOファイルを読み込みその中のX-LoaderをSoC内のRAMに展開して実行
- X-LoaderがmicroSD内のu-bootを起動
- u-boot が 最低限のデバイスを初期化後、uImageをRAMに展開、カーネルを起動
- カーネルが各種デバイスを初期化後、init を起動
ここまでの挙動は、BeagleBoard-xMの固有の動作であり、アーキテクチャやボードによって異なります。
Linux カーネルが最初に起動するプロセスは init という名前のプロセスですが、一般のLinuxディストリビューションで採用されている init と動作が大きく異なります。
Androidのinitプロセスの役割は、大きく分けて二つあります。
- Boot処理部
- Daemon処理部
Boot処理部は、必要なディレクトリの生成後、rcファイルをパースしてそこに登録された処理を実行していきます。
- init.rc
- init.<hardware>.rc
その後Daemon処理部に移ると、3種類のevent用fdをpollしながら電源断までイベント処理を続けます。
- property_set_fd
- signal_fd
- keychord_fd
実は、このあたりの処理が、froyoまでと異なってまして、froyoまでは init が udevd 的な機能も含んでいました。init.c内には、デバイスファイルを生成するためのルールが直に実装されており、init.rcファイルで追加できるものの基本のデバイスファイルはソースコードを変更してビルドし直さないと作れない状態だったわけです。froyoまではDaemon処理部では、上記の他に、device_fdもpollしてましたが、Gingerbreadからはこれが無くなっています。
今回からは、Android.mkで init が、ueventdとしてシンボリックリンクされるようになっており、udevdとして起動されると、ueventd.rc をパースしてデバイスのリストを保持した後、device_fdをpollするように実装されています。
ueventd 自体は、init.rc にサービスとして登録されており、initプロセスとは異なるプロセスとして起動されることになります。なおこれに伴いfroyoまでinit.rc , init.<hardware>.rc で利用できたdeviceコマンドは使えなくなりました。こちらはueventd.rcファイルに記載しueventdのみが利用することにまります。
アプリ側もAPI Levelが変わるとついて行くのが大変そうなんですが、プラットフォーム側もバージョンが上がると結構追いかけるのが大変なんですよねぇ。
0 件のコメント:
コメントを投稿