2016-06-23 5 views
-1

私はいくつかのコンセプトを調整しようとしています。メモリをレイアウトするとき、コンパイラはカーネルのメモリ空間を考慮していますか?

カーネルとすべてのユーザープロセスとの間で仮想メモリが共有されていることが分かりました。これはhereです。また、コンパイラがcode + dataのアドレスを生成するとき、カーネルはそのプロセスの正しい仮想アドレスでそれらをロードする必要があることも知っています。

質問の範囲を制限するために、私は 'コンパイラ'と言いますとgccを意味します。 コンパイラは、カーネル用に予約された高メモリアドレスにコードやデータを置かないことを知るために、OSの新しいリリースごとに準拠する必要がありますか? inと同様に、コンパイラの一部を書く人は、コンパイラが実行可能なコードをハイ・メモリに置かないように、カーネルがプログラムをロードする方法の詳細を知っていなければなりません。

私は別のコンセプトを混乱させるのですか? this tutorialを通過するとき、特にLinuxの低メモリアドレスにOSコードがある最下部に混乱しています。なぜなら、Linuxがカーネルに高いメモリを使用していると思ったからです。

答えて

1

コンパイラは、配置されているメモリ内のアドレス範囲を特定しません。これはOSによって処理されます。

プログラムが最初に実行されると、ローダーはプログラムとそのライブラリのさまざまな部分をメモリに配置します。動的に割り当てられるメモリの場合、大きなチャンクがOSから割り当てられ、その後、より小さなチャンクに分割されることがあります。

OSローダーは物をどこにロードするかを知っています。また、OSの仮想メモリ割り当てロジックは、プロセスが使用するアドレス空間で安全な空きスペースを見つける方法を示します。

「カーネル用に予約されたメモリの高位アドレス」の意味がわかりません。 32ビットオペレーティングシステム上の2G/2Gまたは3G/1Gスプリットについて言えば、それはそれを使用するOSの基本設計要素です。バージョンによって変わることはありません。

高い物理メモリについて話している場合は、いいえ。コンパイラは物理メモリを気にしません。

+0

多くのコンパイラ(またはむしろリンカ)は、実行可能ファイルのさまざまな部分を配置するメモリ上の場所にある、OSに合わせたリンカスクリプトを使ってメモリレイアウトを指定します。 – nos

+0

Linuxの場合、実際には単純です.GCCはほとんどのアーキテクチャで仮想アドレス0にコードを置きます。 – tofro

+0

あなたは正しいです。私は、逆(仮想)アドレスが使用され、混乱していることを見て頭の中でそれを得たようです。 –

1

Linuxは、各アプリケーションにカーネルとは異なる独自のメモリ空間を与えます。ページテーブルにはこのメモリ空間と物理RAMの間の変換が含まれており、カーネルはページテーブルをセットアップして干渉がないようにします。

つまり、コンパイラは、通常、プログラムがメモリにロードされている場所は気にしません。それはなぜだろう?

+0

静的アドレスにjmp命令を入れた場合、または静的/グローバルデータがどこにあるかを知る方法を考えていました。 –

+0

ああ、私はグローバルデータが相対的に扱われているのを見ています。また、直接ジャンプは定義によっても相対的です。 –

関連する問題