2

私は C++ でカーネルを作成しようとしていますが、OS 開発の初心者です。現在、モニターに表示するように実装coutしていますが、いくつかの問題に直面しています。私が尋ねている質問がばかげていることは知っていますが、私はC ++の初心者でもあります。

writeシステム関数を呼び出して画面に表示する OStream クラスを作成しました。その基本クラスは私の Video クラスです。このクラスは名前空間 std に含まれています。したがって、主な問題は、OStream のオブジェクトを作成するときに、そのコンストラクターを呼び出していないため、基本クラスのコンストラクターを呼び出していないため、ビデオメモリが初期化されていないため、画面に何も表示されないことです。

これが私のコードです:

/*OStream.h*/
namespace std{
class OStream:public Video{
    public:
    OStream();
    OStream& operator<<(int);
    OStream& operator<<(String);
    OStream& operator<<(char *cp);
    OStream& operator<<(char c);
    OStream& operator<<(unsigned char *cq);
    OStream& operator<<(unsigned char c1);
};
extern OStream cout;
}

/*OStream.cpp*/
namespace std{
    OStream cout;
    OStream::OStream(){}
    OStream& OStream::operator<<(char *cp){
        write(cp);
    }
    .
    . 
    .
    .
}

OStream上記のコードでは、OStream.cpp ファイル自体にクラスのオブジェクトを作成しています。しかし、メイン モジュールでオブジェクトを作成すると、そのコンストラクタが正常に呼び出されますが、動作しcoutません。

つまり、オブジェクトを明示的に作成すると完全に機能しますが、オブジェクトを暗黙的に作成するにはどうすればよいでしょうか。

また、Interrupt.cpp モジュールでも同じことが起こっています。

ですから、この種の問題を解決するのを手伝ってください。私を助けてください。どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

2

まず、あなたの実装はcout不適合です。C++ 標準ライブラリを作成する場合は、その標準に準拠するように作成する必要があります (標準と思われるものではありません)。

次に、静的コンストラクターのサポートを実装する必要があります。コンパイラを指定していないので、私が言えることは、コンパイラが静的コンストラクターの初期化コードを配置する場所を把握し、プログラムの起動時にそれを呼び出すようにすることだけです。

ゼロから作成するよりも、既存の C++ ライブラリ (GCC の libstdc++ または clang の libc++) を新しい OS に適合させる方がうまくいく場合があります。C++ stdlib の作成は初心者向けではありません。すぐにテンプレートのメタプログラミングに深く入り込むことができます。

于 2011-08-27T19:09:54.507 に答える
-1

コンストラクターを呼び出さずにオブジェクトを作成することはできません。coutしかし、コンストラクターが呼び出されるときのようなグローバル変数では、問題が発生することがあります。異なる .cpp ファイルに 2 つのグローバル変数がある場合、どのグローバル変数が最初に構築されるかを予測することはできません。多分それはあなたが見ている問題ですか?その場合、簡単な答えは、すべてのグローバル変数を 1 つの .cpp ファイルに入れることです (必要に応じて globals.cpp と呼んでください)。次に、グローバル変数は、その .cpp ファイル内で宣言した順序で構築されます (逆の順序で破棄されます)。

于 2011-08-27T19:25:25.417 に答える