近年、機能の複雑化が進むデジタル家電や携帯機器のOSに、LinuxやAndroidを使用するケースが増加していますが、電源断からの起動(コールドブート)時間が数十秒から1分前後もかかり、機器メーカーにとって改善すべき課題となっています。
Ubiquitous QuickBootはそのような課題を根本から解決するために、独自開発した新技術を採用したソリューションです。
システムの起動に必要なメモリー領域を優先的に不揮発性ストレージからRAMに復元することで、他の方式と比べて圧倒的な速度で瞬間起動を実現し、 Android(注1)を使用した実装例では、電源投入からわずか1秒台(注2)でアプリケーション実行状態まで復元可能で、Androidの起動時間としては世界最速です(注3)。また、アプリケーション側で使用しているメモリー量に依存せず常に高速起動が可能であり、残りのメモリー領域は起動後に順次 読み込みを行うため、ユーザーの操作にほとんど影響を与えません。
本ソリューションを利用することで、ユーザーの操作性を損なわず、待機電力をほぼゼロにした状態からシステムを瞬間起動できるデジタル家電や携帯機器などの製品を、開発いただくことが可能となります。
図1:ハイバネーション方式とクイックブートの動作原理の違い
図2:システム状態のメモリ・サイズと起動時間の関係模式図
(注 1):米Google社を中心に設立された「Open Handset Alliance」(オープン・ハンドセット・アライアンス)が提供する、モバイルデバイス向けプラットフォームであり、最近では、携帯電話以外にも、様々なデジタルネットワークデバイス向けの利用が注目されています。
(注2):下記の環境にてストップウォッチにて実測しました。
・環境:Android / Armadillo-500FX (アットマークテクノ社製:ハードウェア改造無し)
・使用RAMサイズ :105~110Mバイト
・RAMイメージサイズ :128MB (イメージ非圧縮、XIP未使用)
・電源投入から下記デモが動作、もしくは操作可能になるまでの起動時間:
GlobalTime 起動時間 約1秒
GLSurfaceView 起動時間 約1秒
AnimateDrawables 起動時間 約1秒
(注3):2009年11月現在、ユビキタス社調べ
Linux の起動時間の問題に対するアプローチとしては、大別すると次の2つのアプローチが試みられてきました。
チューニングによる高速化に関しては、Linuxディストリビュータ、Linuxコミュニティ、CELF 等を中心に検討が進んできました。Linux kernel単体では、約500msで起動できるレベルに達しています。しかしながら、アプリケーションそのものの起動時間に関しては、アプリケーションが肥大化してきていることもあり、プレリンクやReadAhead等の技術が開発されて以前に比べて改善はされてはいるものの、期待するレベルには達していないのが実状です。
一方、ハイバネーションを応用した高速化に関しては、アプリケーション動作時のRAMに展開されたシステム状態を、フラッシュメモリーのような不揮発性ストレージに保存し、電源投入後にRAMに復元するというハイバネーション方式を応用した高速復帰の手法が一つの解決策として一部の機器で使われ始めています。しかし、このハイバネーション方式を応用した高速化では、システムやアプリケーションが使用するメモリー空間が大きくなるほど、ストレージからRAMへ読みだして展開する時間が増大していき、起動時間が遅くなるという欠点があります。
ユビキタスでは、QuickBoot をお客様のターゲット環境に実装するためのコンポーネントを QuickBoot SDK (ソフトウェア開発キット) として提供しています。
QuickBoot SDK は、特定のリファレンスボードに QuickBoot を適用する例を示すことにより、その適用例を参照することによって、お客様のターゲット環境に QuickBoot を簡単に実装できるように設計されています。
QuickBoot SDK には、次のコンポーネントとドキュメントが同梱されています。
| コンポーネント | 機能概略 | 提供 形態 |
|---|---|---|
| QuickBoot スナップショットスクリプト | Linux 上で実行するシェルスクリプト。所望のアプリケーションを起動した後に、このシェルスクリプトを実行して、そのアプリケーションの実行状態を保存・復帰させます。 | Source |
| QuickBoot スナップショットドライバ | このドライバでは、RAM イメージを不揮発性メモリへ書き込む処理および周辺 I/O のレジスタ値等の保存・復帰処理等を行います。 | Binary |
| QuickBoot BIOS/IRA | QuickBoot BIOS は、Linux とは独立して動作し、不揮発性メモリへのアクセス処理を行います。また、QuickBoot IRA(*) は、高速起動のコア機能で、次に必要なデータを不揮発性メモリから優先的に読み込む処理を制御します。(*)IRA : Intelligent Resource Allocator の略 | Binary |
| Kernel Patch | QuickBoot を適用する上で必要なKernelへの変更部分をKernel Patchとして提供します | Source |
| ブートローダー サンプル |
QuickBoot を適用したブートローダーサンプルを提供します。 | Source |
| 種類 | 内容 |
|---|---|
| デベロッパーズマニュアル | QuickBoot機能概要、各種ツールの使用方法、QuickBootの適用方法などQuickBootを実装する技術情報が記述されています。 |
| アプリケーションノート | QuickBootを実際にターゲットに適用する上で考慮する必要のある、既存のアプリケーションの変更点、カーネル、ユーザランドのアップデート方法などを具体的に解説します。 |
Linux/Android における QuickBoot の各コンポーネントの位置づけは、次図の通りです。
QuickBootをターゲット環境に実装する場合、ターゲット環境に合わせて次の開発作業が必要になります。
[1] 不揮発性メモリーからRAMへQuickBoot BIOS/IRAを転送するコードをブートローダーへ組み込む
[2] 通常ブートとQuickBootの切り替え機能をブートローダーへ組み込む
[3] QuickBootスナップショットスクリプトをターゲットアプリケーション環境に合わせてカスタマイズ
[4] H/W依存部やI/Oレジスタを保存するための関数を開発
[5] 不揮発性メモリーへのRead/Writeライブラリの作成
[6] H/Wの初期化処理、I/Oレジスタ等の復元するための関数を開発
・Suspend/Resume(ACPI S4相当)対応のデバイスドライバをサポートしているデバイスが既にサポートされている場合には、
それを利用可能。
・サポートしていない場合で、かつ、スナップショットイメージを取得時にデバイスをcloseできないI/Oに関しては、
Suspend/Resume対応処理をデバイスドライバに追加が必要。
・通常のI/Oであれば、QuickBoot起動後にドライバモジュールをinsmodすることでも対応が可能です。