12

再起動コマンドのAndroid ソースを調べると、次の行が見つかります。

__reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, \
         LINUX_REBOOT_CMD_RESTART2, argv[optind]);

これは、特定のコマンドでシステムを再起動する標準の Linux システム コールです。 Unix System Call Rebootを参照してください。

Android では、このコマンドは、カーネルをリカバリ モードで起動するか、ブートローダー内で fastboot モードに移行するかをブートローダーに指示するために使用されます。

私の質問は次のとおりです。ブートローダーはどのようにコマンドを取得しますか? この機能は U-Boot に実装されていますか? (GoogleまたはU-Bootソースで検索しても見つかりません。)

さらに、これは Android に固有のものではないようですが、Linux が「コマンドによる再起動」を実行する方法です。Linuxでこれが「通常」どのように処理/使用されるかについての情報はありますか?

4

4 に答える 4

7

を使用してシステムを再起動するLINUX_REBOOT_CMD_RESTART2と、提供されたコマンド文字列が に登録されているすべての通知機能に渡されregister_reboot_notifer()、最後にmachine_restart()- 実際にシステムの再起動を実行するアーキテクチャ固有の関数に渡されます。

ほとんどのアーキテクチャは、渡されたコマンドを完全に無視します。そうでない例については、SPARC を参照してください。のSPARC 実装はmachine_restart()、提供された文字列をbootPROM のコマンドに渡します。

ARM 実装はmachine_restart()、各 ARM プラットフォームで個別に実装されている提供されたコマンドを渡すことarch_reset()になります。少なくとも上流のカーネルでは、これらの実装のすべてではないにしても、ほとんどが渡されたコマンドを無視します。これはあなたが探しているドロイドではないかもしれません。

于 2011-04-01T06:42:01.257 に答える
2

MSC パーティションに「boot-recovery」コマンドを書き込みます。ブートローダーは MSC パーティションから文字列を読み取り、リカバリ カーネルをロードします。これは、Froyo 以前のリカバリ カーネルのロード方法でした。GB/HC/ICS でも同じアプローチを採用できます。

もう 1 つの方法は、メモリを分割して、ブートローダから読み取ったフラグを渡すことです。唯一の問題は、SDRAM をセルフ リフレッシュ モードにしない限り、再起動中に DRAM の内容が失われる可能性があることです。したがって、再起動中にこれを処理する必要があります。

最初の方法は、アップデート中に電源が切れた場合に便利です。この場合、デバイスはリカバリ カーネルに再度入る必要があります。その場合、更新プロセス全体が成功した後にのみ、MSC パーティションをクリアする必要があります。

于 2012-02-27T12:50:07.297 に答える
1

Android でどのように行うのかはわかりませんが、u-boot を使用するシステムでも同様のメカニズムがあります。

ブートローダーからカーネルへの「通信」、およびその逆方向の「通信」用に予約されている非常に小さなメモリ部分を予約します。このメモリが再起動後も存続できる場合 (再起動前に RAM をセルフ リフレッシュ モードにするか、フラッシュに入れる)、ブートローダーの開始時に値を読み取り、通常はカーネルとシステムを起動する必要があるかどうかを判断するのは簡単です。または、ブートローダーの特別なモードに移動したい。

于 2011-03-30T06:31:02.413 に答える
0

一部の ARM プロセッサでは、実行中のカーネルが CPU レジスタの 1 つにフラグを設定し、UBOOT によって読み取られます。非常にハードウェア固有の場合は、このことに注意してください。

于 2014-10-09T18:14:13.527 に答える