C ++でのOS開発に関する質問


9

修士課程のプロジェクトとして、シンプルなオペレーティングシステムを設計しています。x86アーキテクチャで16ビットリアルモードで実行するように設計されています。理想的には、このOSをC ++で開発し、必要な場合にのみアセンブリを使用したいと考えています。これまでのところ、私はC ++とasmの混合であるカーネルをロードするアセンブリで書かれたブートローダーを持っています。私の質問は、C ++の使用に関するものです。現在のところ、コンパイルして実行できますが、動的メモリ割り当ては使用していません。

Cを使用している場合、メモリ割り当てを処理するmalloc関数を作成することは理にかなっていますが、C ++では新しいキーワードが使用されます。そう...

'new'はメモリを割り当てるために舞台裏でどのように機能し、これをどのように処理しますか?

そして当然の結果として...

C ++を使用して、より高いレベルの抽象化を利用することは理にかなっていますか?それともそれを使うのはもっと頭痛の種になるでしょうか?そして私はCを使い続けるべきですか?

C ++が適切でないと思われる場合は、根拠を提供してください。

回答:


9

new実際に割り当てオフキーワードの手operator newにかなり似た振る舞い、mallocそれはどこかからメモリを取得します。その後、コンパイラーはコンストラクターの魔法をすべて実行します。したがって、C ++コンパイラは、C ++ランタイムライブラリ(またはコード)がの実装を提供することを期待しますoperator new

特定の抽象化にC ++を使用することは確かに理にかなっています。OSが独自にロールする理由はありませんstd::list<>。例外ははるかに厄介です。その間には、役に立つものから役に立たないものへの勾配があります。std::complex?それは完全に機能しますが、なぜそれが必要なのでしょうか?


5

C ++に対するC ++の利点の多くは、ランタイムサポートとは何の関係もありません。その場合、Cで記述されたコードとC ++で記述されたコードの間に違いはありません。たとえば、テンプレートは実行時に何もしません。彼らはあなたが多くの余分なタイピングであなたがすることができなかった何もしません。C ++は、必要なときに低レベルのアクセスを提供し、ビットをいじる必要がないときにCよりも高いレベルの抽象化と組み合わせることで、オペレーティングシステムを記述するための非常に合理的な言語です。

new2つのことを行います。メモリをどこかから取得し、必要なコンストラクタを実行します。メモリを取得することは、と同じmallocです。


3

おそらく、new式のために通常生成されるコードの大まかな考えを与えることは合理的でしょう。これは、コンパイラによって生成されていますが、あれば、あなたが機能として実装された、それは次のようになります。

template <class T>
T *new_object() { 
    void *raw_data = ::operator new(sizeof(T));
    return new(raw_data) T;
}

あなたがどのようにnew機能するかについて気にかけている場合、(ほぼ)避けられないフォローアップはどのようにdelete機能するかです:

template <class T>
void delete_object(T const *object) { 
    object->~T();
    ::operator delete(object);
}

他の人がすでに指摘し、てきたように::operator new::operator delete、かなり基本的なメモリアロケータです。例えば、Unixライクなシステム上で彼らはおそらくのようなものを呼びたいbrkか、sbrkメモリの大きなチャンクを割り当てるために、その後、それらの大きいブロックから小さな塊を配ります。あなた自身のOSでも、おそらく何らかのアナログsbrkなどが必要です。本質的にすべてのメモリを「空き」として開始し、必要に応じてメモリの一部を割り当てるものです。リアルモードで作業していることを考えると、それはおそらくかなり単純です。使用可能なメモリが少ないことを考えると、実用的な設計では、手の込んだアルゴリズムよりも小さいサイズを強調する必要があります。


-4

ほとんどのオペレーティングシステムはCI thinkで記述されています。一方、それは修士のプロジェクトなので、何か別の面白いことをしてください。


1
ほとんどの大規模なオペレーティングシステムは、C ++が利用可能になる前に最初に作成されました。それは選択を制限しました。:-)
Bo Persson、

1
時々私は反対票が伝染すると思います。
ケビン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.