4

私は組み込み開発の初心者であり、従来の Linux と uClinux の大きな違いは、uClinux には MMU がないことです。

この記事から:

VM を使用しない場合、各プロセスは実行可能なメモリ内の場所に配置する必要があります。最も単純なケースでは、このメモリ領域は連続している必要があります。通常、その上下に他のプロセスがある可能性があるため、拡張することはできません。つまり、uClinux のプロセスは、従来の Linux プロセスのように、実行時に使用可能なメモリのサイズを増やすことができません。

私には、これはすべてのデータがスタックに存在する必要があるように聞こえます。そのヒープ割り当ては不可能です。つまり、malloc() や "new" は問題外です...それは正確ですか? おそらく、「静的ヒープ」(つまり、「動的」割り当てを要求できるスタックベースの領域)を管理できる手法/ライブラリがありますか?

それとも私はそれを考えすぎていますか?それとも単純化しすぎ?

4

3 に答える 3

4

通常の Linux では、プログラマーは物理リソースを扱う必要はありません。カーネルがこれを処理し、ユーザー空間プロセスはそれ自身のアドレス空間のみを認識します。スタックが大きくなるか、malloc タイプの要求が行われると、カーネルは空きメモリをプロセスの仮想アドレス空間にマップします。

uClinux では、プログラマは物理メモリにもっと関心を持つ必要があります。MMU と VM は使用できず、すべてのアドレス空間がカーネルと共有されます。ユーザー空間プログラムがロードされると、プロセスにはテキスト、スタック、および変数用の物理メモリ ページが割り当てられます。プロセスのプログラム カウンター、スタック ポインター、およびデータ/bss テーブル ポインターは、物理メモリ アドレスに設定されます。ヒープ割り当て (malloc タイプの呼び出しによる) は、同じプールから行われます。

プログラムでヒープ割り当てを取り除く必要はありません。いくつかの新しい問題に関心を持つ必要があります。スタックは仮想メモリを介して拡張できないため、スタック オーバーフローを防ぐために、リンク中に適切なサイズにする必要があります。小さな空きページを統合する MMU がないため、メモリの断片化が問題になります。誤ったポインタは、物理メモリのどこにでも意図しない書き込みを引き起こす可能性があるため、より危険になります。

于 2012-06-08T20:51:01.133 に答える
0

uCLinux を使ってからしばらく経ちましたが (メイン ツリーに統合される前のことです)、malloc は c ライブラリの一部としてまだ利用できると思っていました。ヒープが分離されていないため、メモリ内で非常に悪いこと (tm) を実行する可能性がはるかに高くなりましたが、それは可能でした。

于 2012-06-07T20:21:24.453 に答える
0

はい、uclinuxのユーザー空間アプリケーションでmallocを使用できますが、ユーザー空間アプリケーションのスタックのサイズを増やす必要があります(プログラムを実行する前にスタックサイズが静的になるため)、mallocを実行するとスペースが取得されますニーズ。たとえば、arm-cortex の uclinux アーム ツールチェーンは、ユーザー アプリケーションのバイナリで使用されるスタックのサイズを見つけて変更するコマンドを提供し、それを組み込みシステムに転送して実行できます ----- > arm-uclinuxeabi-flthdr

于 2016-06-03T12:00:22.087 に答える