0

私は現在、自分のカーネルをボトムアップで作成している最中ですが、リニアメモリマネージャーでこの小さな問題に遭遇しました。これは理解できないようです。

次のコードがあります。 void* end_page_address = /*(void*)*/ 0x3FF000;

ただし、voidポインターのキャストを無効にすると、g++で次のエラーが発生します。

src/paging/LinearMemoryManager.cpp: In constructor 'LinearMemoryManager::LinearMemoryManager(PhysicalMemoryManager*)': src/paging/LinearMemoryManager.cpp:87:42: error: invalid conversion from 'int' to 'void*' [-fpermissive]

どうして?-明らかに一般的には必要ないため、そのすぐ上の行はキャストなしで問題なくコンパイルされます。

void* start_page_address = 0x00000000;

4

1 に答える 1

1

0x00000アドレス0を持つNULLポインター(または同様に記述されている場合でも)は、C ++仕様(およびGCCコンパイラー内)で特定の処理に値すると思います。ところで、C ++ 11が追加されnullptr、そのタイプには正当な理由があります。

ただし、ゼロ以外のアドレスにvoid* end_page_address = (void*) 0x3FF000; は明示的なキャストが必要です。

カーネルをコーディングするときは、C ++のトリック(例外、コンストラクター、RTTIなど)を知っているといいのですが。特定のバージョンがそれらをどのように処理するかを正確に理解する必要がある場合がありg++ます。

また、カーネルが自由ソフトウェア(GPL-ed)であり、 「早期にリリースし、頻繁にリリースする」というモットーに従っていることを願っています。そのソースコードの内部を調べたいと思います。

于 2012-09-10T15:12:48.213 に答える