私はいくつかのコンセプトを調整しようとしています。メモリをレイアウトするとき、コンパイラはカーネルのメモリ空間を考慮していますか?
カーネルとすべてのユーザープロセスとの間で仮想メモリが共有されていることが分かりました。これはhereです。また、コンパイラがcode + dataのアドレスを生成するとき、カーネルはそのプロセスの正しい仮想アドレスでそれらをロードする必要があることも知っています。
質問の範囲を制限するために、私は 'コンパイラ'と言いますとgccを意味します。 コンパイラは、カーネル用に予約された高メモリアドレスにコードやデータを置かないことを知るために、OSの新しいリリースごとに準拠する必要がありますか? inと同様に、コンパイラの一部を書く人は、コンパイラが実行可能なコードをハイ・メモリに置かないように、カーネルがプログラムをロードする方法の詳細を知っていなければなりません。
私は別のコンセプトを混乱させるのですか? this tutorialを通過するとき、特にLinuxの低メモリアドレスにOSコードがある最下部に混乱しています。なぜなら、Linuxがカーネルに高いメモリを使用していると思ったからです。
多くのコンパイラ(またはむしろリンカ)は、実行可能ファイルのさまざまな部分を配置するメモリ上の場所にある、OSに合わせたリンカスクリプトを使ってメモリレイアウトを指定します。 – nos
Linuxの場合、実際には単純です.GCCはほとんどのアーキテクチャで仮想アドレス0にコードを置きます。 – tofro
あなたは正しいです。私は、逆(仮想)アドレスが使用され、混乱していることを見て頭の中でそれを得たようです。 –