2

Cがグローバル変数にメモリを割り当てる方法を理解しようとしています。

私は単純なカーネルに取り組んでいます。これまでのところ、画面に出力して割り込みを有効にすること以上のことはできません。私は現在、基本的な物理メモリ マネージャーに取り組んでいます。

私のメモリ マネージャは、メモリが割り当てられているか使用可能な場合に 1 または 0 を設定するビットマップです。カーネルが使用しているメモリを「割り当て済み」としてビットマップに追加する必要があるため、何も上書きされません。

カーネルは 0x100000 に静的にロードされるため、カーネルの開始点を簡単に見つけることができます。長さを把握することもそれほど難しくありません。私がよくわからない部分は、グローバル変数がメモリに置かれている場所ですか?

私のカーネルが 12K だとしましょう。保護のために、これら 3 つの 4K ブロックのメモリをカーネルに割り当てることができます。使用する変数をカバーするために、さらに割り当てる必要がありますか? それとも、変数はその 12K の一部ですか?

助けてくれてありがとう、私は十分な意味を持っていることを願っています.

4

3 に答える 3

2

見て

http://www.geeksforgeeks.org/archives/14268

あなたのグローバルはほとんどBSSにあります

于 2012-06-25T02:13:22.570 に答える
1

前の回答が示すように、ほとんどの変数は .bss セクションに格納されますが、グローバル変数を static または const として定義したかどうかに応じて、.data または .rodata セクションに格納することもできます。コンパイル後、 readelf -S kernel.bin を使用して、各セクションが使用するスペースを正確に確認できます。.bss セクションの場合、メモリはバイナリがメモリにロードされるときにのみ占有され、ディスク上のスペースを消費しません。これは、コンパイルされたカーネル バイナリが、(通常は grub によって) 後でメモリに読み込まれるときに使用される実際のサイズよりも小さくなることを意味します。

readelf を使用する以外にカーネルが使用するデータ量を正確に把握する簡単な方法は、リンカー スクリプト内の .data セクション内に .bss セクションを配置することです。カーネルバイナリのサイズは、ディスク上とメモリ内の両方で同じサイズになります (または、すべてのセクションが grub によってコピーされるわけではないため、実際にはメモリ内で少し小さくなります) が、少なくともメモリの最小量がわかります。割り当てる必要があります。

于 2012-06-26T12:55:04.523 に答える
0

カスタム リンカー スクリプトを使用することをお勧めします (使用すると仮定しますgcc): これにより、カーネル セクションのレイアウトが明確になり、カスタマイズ可能になります (リンカー スクリプトの詳細については、 を参照してくださいinfo ld)。私の OS のリンカー スクリプトの例は、こちらでご覧いただけます

デフォルトのリンカ スクリプトを表示するには-v、.--verboseld

ほとんどのグローバル変数は.data.*および.rodata.*セクションにあり、0 で初期化された変数は に入り.bssます。

于 2012-12-07T17:26:46.130 に答える