3

C++ でカーネルを開発しています。しかし、私は書きたくありませんstdlib; そのためにSTLport http://www.stlport.org/をダウンロードしましたが、インストール方法と使用方法がわかりません。

カーネルの構築に Linux を使用しています。

カーネルで C++ 標準ライブラリを使用するにはどうすればよいですか?

また、STLport からすべてのライブラリを移植したくありません。選択したライブラリを除外するにはどうすればよいですか? などのようstd::stringに。std::vector

4

3 に答える 3

3

カーネル開発でSTLを使用しないことをお勧めします。STLは、カーネルに存在しない何らかの形式の標準ライブラリサポートを想定しています。また、ほとんどのメモリ割り当て操作には、かかる時間に制限がないため、割り込みハンドラでの使用には適していません。例外は、カーネルに大きな頭痛の種を引き起こす可能性のあるもう1つのものです。

于 2011-09-19T12:57:11.487 に答える
3

STL が機能するためには、静的初期化 (std::cin および std::cout など) やスタックの巻き戻しなど、いくつかのものを移植する必要があります...

ie: libsupc++ を移植し、それをカーネルに含める必要があります。基本的に、これらすべてはそもそもカーネルにあるべきではありません。ベクターはデータを再割り当てする可能性があるため、静的配列を使用しないでください

また、それらすべてがカーネルを無駄に肥大化させます!

L4 がカーネルで使用できるものを確認できます。それらはメモリ割り当てを行わず、例外 (予測不可能) も行いません。また、特に STL も行いません。

後者のリンクは、C++ オペレーティング システムのサポートを得るために何を移植する必要があるかを示しています。libsupc++ は gcc の一部です。その目的は、ランタイム コードが必要なすべての部分をカプセル化することです。

libsupc++ に関する有用な情報

C++ オペレーティング システムのサポートに関する有用な情報

于 2011-09-19T16:15:52.583 に答える
2

カーネルのSTLが実際に持っているのが良いかどうかはわかりませんが、本当に試してみたいのであれば、とても楽しいです。私は自分のOSを作成しましたが、カーネルにメモリを割り当てたとき、最初に行ったのはSTLport(5.2.1)の移植でした。カーネル自体はまだ予備的すぎますが、これまでのところうまく機能していました。

とにかく、私はそれを移植することに関するいくつかの経験を共有することができます。

  1. STLportの移植には、ビルドは不要で、前提条件はほとんどありません。ヘッダーを含めて、コンパイラにパスを通知するだけです(gccの-Iオプション)。テンプレートクラスは、cppソースファイルを使用してコンパイルされます。

  2. STLportは構成可能であり、余裕のないものを無効にして、iostream、デバッグ、例外、RTTI、スレッドなど、必要なものを選択できます。ドキュメントをチェックアウトしてから構成ヘッダーにアクセスするだけで、非常にうまくコメントされています(例:stlport / stl / config / user_config.h)

  3. 最も基本的なものとして、mallocfree、または多分newdeleteとバリアントが必要になります。std文字列、コンテナ、アルゴリズム、IIRCを移植するにはこれで十分です。ただし、スレッドセーフでもメモリ割り当ての最適化でもないため、信頼する場合は十分に注意する必要があります。

  4. iostreamを所有することはできますが、それは単なるテンプレートクラスとグローバルオブジェクトです(ところで、ELFセクションをハッキングし、関数を呼び出してグローバルオブジェクトを手動で初期化しました)が、これにはさらに作業が必要です。

于 2012-10-08T13:03:17.627 に答える