アカウント名:
パスワード:
推測を含むけど、高速起動へのアプローチは...
・ブートローダがDMA対応。FlashからSDRAMへのカーネル転送が高速かつ、その間ビデオ周りなどの初期化を走らせてる・カーネルイメージは非圧縮の方が早い (結果、DMA転送だけでの展開が可能になり、高速化とその間のCPUリソース確保に貢献)・時間のかかるデバイスの初期化、サービスの起動は後回しにして勘定に入れない(カーネル起動後、後でゆっくり)・カーネル起動後、ユーザプロセスを起動する前にFlash上に保存してある「ユーザプロセス起動後の画面と同じ画像」をフレームバッファに叩き込み、見た目だけは見繕う(
the boot performance was achieved through careful turning of the software stack starting with the bootloader, a highly optimized kernel that's kept uncompressed in NOR flash, and loading only required drivers.
まず、カーネルはロードするのではなく主記憶(NORフラッシュ)空間に非圧縮(ご明察)で最初からある、そして必要なドライバしかロードしない。
lunuxザウルスもそうですが、組み込み系ではカーネルやユーザーランドプログラムの入ったROM/flashを主記憶に配置してプログラムのロードをそもそも不要にする(データ/スタック/ヒープセグメントの割り当て+初期化は必要)のは定番です。 また、デバイスプローブを一切なくするのも定番。 特定HW用の組み込みでは存在するデバイスがあらかじめ分かっているので、存在するデバイスしかカーネルに組み込まない。また、デバイスのアドレスや割り込みベクタも決め打ち。 シャープの地デジTV(?)ではそれすら省略して、デバイスドライバをアプリ側に持たせることによってカーネルのブートを早めたりしている(と、中の人が言ってました)。
いまどきのPCのようにGB単位のRAMが積んであると、起動時の最低限のメモリテストだけでも1秒経ってしまうでしょうね。 あと、HDDのように本質的にコールドブート(スピンアップ)に数秒かかるI/Oがあるとどうしようもない。
どっちにしても、同じフラッシュメモリならを主記憶に置くのとI/Oにつなげといてそこからロードするのでは、主記憶に置いといてロードなしに直接実行できるほうが起動は早そう(まけおしみ)。
今回の記事の対象のHWに関しては、カーネルをフラッシュメモリ非圧縮で 置いとくことが起動高速化に貢献していることは確かですよね。でもよく読むとどこにも「主記憶にマップされてる」とは書いてなかった。がっくり。
NORにカーネルをマッピングするXIPカーネルじゃないんですかね。あとはPrelink+UserModeXIPでアプリ起動もガリガリに高速化してるということも。
もっとも、そんな贅沢にNORは使えませんけれども。。。
lunuxザウルスもそうですが、組み込み系ではカーネルやユーザーランドプログラムの入ったROM/flashを主記憶に配置してプログラムのロードをそもそも不要にする(データ/スタック/ヒープセグメントの割り当て+初期化は必要)のは定番です。
lunuxザウルスがどんなものかは知りませんが、linux搭載のザウルスの起動速度は決して速いといえるような代物ではありません。1分弱といったところではないでしょうか?また、ブートローダがフラッシュストレージからメインメモリに展開しますので「プログラムのロードが不要」と言うこともありません。ついでに言うとカーネルなどはNANDからのロードです。
そもそもメモリ空間に貼り付けられたフラッシュの方が外部ストレージより速い。というのも相当な思い込みです。
普通、NANDフラッシュを主記憶にはできませんよ。
できますよ。件のSheevaPlugなんかどこにもNORフラッシュ付いてませんしね。普通にオンチップNANDフラッシュコントローラの先のフラッシュから立ち上がってきます。
で、これを普通でないと言うつもりなら...
書き込みは遅いですが、読み出しはSDRAMなみのスピードが出ます。サイズも2Gbのものまでありますよ。
は確実に普通じゃないと思いますね。#SDRAM並はちょっと大げさだなぁ。
> できますよ。> 件のSheevaPlugなんかどこにもNORフラッシュ付いてませんしね。> 普通にオンチップNANDフラッシュコントローラの先のフラッシュから立ち上がってきます。
たいていこの手のものは、CPUのオンチップROMかシーケンサでNANDコントローラから(初期化データ+)ブートローダをDRAMにコピーしてから起動(というかジャンプ)のはず。SheevaのMarvelのチップはどうだったかな~?
いずれにせよ、NANDフラッシュはアドレスの概念ではなくセクタの概念での制御なのでCPUが主記憶として直接コードをフェッチするものは聞いたことがないですね。NANDはエラー検出&訂正もセクタ単位だし。ま、立ち上がるという表現ならNANDフラッシュからに見えますが、主記憶というわけではないですね。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell
ハイバネーションではない模様 (スコア:2, 興味深い)
推測を含むけど、高速起動へのアプローチは...
・ブートローダがDMA対応。FlashからSDRAMへのカーネル転送が高速かつ、その間ビデオ周りなどの初期化を走らせてる
・カーネルイメージは非圧縮の方が早い (結果、DMA転送だけでの展開が可能になり、高速化とその間のCPUリソース確保に貢献)
・時間のかかるデバイスの初期化、サービスの起動は後回しにして勘定に入れない(カーネル起動後、後でゆっくり)
・カーネル起動後、ユーザプロセスを起動する前にFlash上に保存してある「ユーザプロセス起動後の画面と同じ画像」をフレームバッファに叩き込み、見た目だけは見繕う
(
Re:ハイバネーションではない模様 (スコア:2, 参考になる)
まず、カーネルはロードするのではなく主記憶(NORフラッシュ)空間に非圧縮(ご明察)で最初からある、そして必要なドライバしかロードしない。
lunuxザウルスもそうですが、組み込み系ではカーネルやユーザーランドプログラムの入ったROM/flashを主記憶に配置してプログラムのロードをそもそも不要にする(データ/スタック/ヒープセグメントの割り当て+初期化は必要)のは定番です。 また、デバイスプローブを一切なくするのも定番。 特定HW用の組み込みでは存在するデバイスがあらかじめ分かっているので、存在するデバイスしかカーネルに組み込まない。また、デバイスのアドレスや割り込みベクタも決め打ち。 シャープの地デジTV(?)ではそれすら省略して、デバイスドライバをアプリ側に持たせることによってカーネルのブートを早めたりしている(と、中の人が言ってました)。
いまどきのPCのようにGB単位のRAMが積んであると、起動時の最低限のメモリテストだけでも1秒経ってしまうでしょうね。 あと、HDDのように本質的にコールドブート(スピンアップ)に数秒かかるI/Oがあるとどうしようもない。
Re:ハイバネーションではない模様 (スコア:1)
どっちにしても、同じフラッシュメモリならを主記憶に置くのとI/Oにつなげといてそこからロードするのでは、主記憶に置いといてロードなしに直接実行できるほうが起動は早そう(まけおしみ)。
今回の記事の対象のHWに関しては、カーネルをフラッシュメモリ非圧縮で 置いとくことが起動高速化に貢献していることは確かですよね。でもよく読むとどこにも「主記憶にマップされてる」とは書いてなかった。がっくり。
Re: (スコア:0)
NORにカーネルをマッピングするXIPカーネルじゃないんですかね。
あとはPrelink+UserModeXIPでアプリ起動もガリガリに高速化してるということも。
もっとも、そんな贅沢にNORは使えませんけれども。。。
Re: (スコア:0)
userlandのXIPはやってると思いますが。
動画の後ろの方で、非圧縮vmlinuxとinitramfsと画面イメージを
DMAでNOR FLASH->SDRAMにコピーしてるんで速いよ。
てな事を説明しているので、NOR FLASHは結構贅沢に使ってるようで。
Re: (スコア:0)
カーネルがストレージ上のアプリのイメージをmmapして実行するよ
ページフォールトが起きるとカーネルがストレージからページをロードする
もしかしてPIザウルスのことを言っているのか?
Re: (スコア:0)
lunuxザウルスがどんなものかは知りませんが、linux搭載のザウルスの起動速度は決して速いといえるような代物ではありません。1分弱といったところではないでしょうか?
また、ブートローダがフラッシュストレージからメインメモリに展開しますので「プログラムのロードが不要」と言うこともありません。
ついでに言うとカーネルなどはNANDからのロードです。
そもそもメモリ空間に貼り付けられたフラッシュの方が外部ストレージより速い。というのも相当な思い込みです。
Re:ハイバネーションではない模様 (スコア:1)
普通、NANDフラッシュを主記憶にはできませんよ。
NANDフラッシュは外部ストレージと同じ扱いです。
NORフラッシュはオンチップなものだけではありません。
CPUのメモリバスにつなげてつかう汎用品があります。
32bitのバスに2個の16bit幅のNORフラッシュをつなげて使ったりします。
書き込みは遅いですが、読み出しはSDRAMなみのスピードが出ます。
サイズも2Gbのものまでありますよ。
欠点はNANDよりサイズが小さく、高価なことでしょう。
組み込みでは、ワークメモリはSDRAM(SDRやDDR,DDR2)、コードはNORフラッシュ、
ストレージはNANDフラッシュを使うということをよくやります。
# NORで性能が足りなければコードもSDRAMにロードしてしまうこともあります
Re: (スコア:0)
できますよ。
件のSheevaPlugなんかどこにもNORフラッシュ付いてませんしね。
普通にオンチップNANDフラッシュコントローラの先のフラッシュから立ち上がってきます。
で、これを普通でないと言うつもりなら...
は確実に普通じゃないと思いますね。
#SDRAM並はちょっと大げさだなぁ。
Re: (スコア:0)
> できますよ。
> 件のSheevaPlugなんかどこにもNORフラッシュ付いてませんしね。
> 普通にオンチップNANDフラッシュコントローラの先のフラッシュから立ち上がってきます。
たいていこの手のものは、CPUのオンチップROMかシーケンサでNANDコ
ントローラから(初期化データ+)ブートローダをDRAMにコピーしてから
起動(というかジャンプ)のはず。
SheevaのMarvelのチップはどうだったかな~?
いずれにせよ、NANDフラッシュはアドレスの概念ではなくセクタの概念での
制御なのでCPUが主記憶として直接コードをフェッチするものは聞いたことが
ないですね。NANDはエラー検出&訂正もセクタ単位だし。
ま、立ち上がるという表現ならNANDフラッシュからに見えますが、主記憶と
いうわけではないですね。