2017-11-07 14 views
0

私は何時間もこの質問を検索してきましたが、私が探している簡単なyesまたはnoの答えを見つけることはできません(またはOSやアーキテクチャに依存するかもしれません)。これはおそらく非常に些細な質問かもしれません。環境変数はカーネル空間の一部ですか?

私の勘違いは、プロセスの環境変数がカーネル空間にあり、カーネルのデータ構造であり、仮想アドレス空間のプロセスイメージのすぐ上に生きていることです。

+3

いいえ。プロセスの通常のデータスペースに格納されます。これは、プロセスが親の環境変数を変更する方法がないが、変更された環境変数をその子に渡すことができる理由です。 Linuxでは、 'main()'の3番目の引数としてポインタを取得することさえできます。また、「カーネルデータ構造が仮想アドレス空間のプロセスイメージの上に生きている」という文章は無意味です。仮想アドレス空間は仮想です。 – AlexP

+0

答えをありがとう。物理的な意味で無意味なことを知っています。そのため、物理アドレス(ページングによる)に変換されてアドレスバスに送られる前に、プロセスがアドレスをどのように見ているかという事実上のアドレス空間を書きました。 – deftextra

+0

ポイントは仮想アドレス空間が仮想だということです。仮想アドレスと物理アドレスの間には何の関係もありません。配列 'int x [100]'を考えてみましょう。今、「x + 5」は「x + 55」よりも低い仮想アドレスであるが、「x + 5」の対応する物理アドレスは「x + 55」の対応する物理アドレスよりも高くてもよく、それらの一方または両方に対応する物理アドレスがないことさえある。 – AlexP

答えて

1

なぜ環境はカーネルに格納されていると思いますか?

これには、それをエクスポートするための専用のシステムコールまたはプロセスにマップされた共有メモリ領域が必要です。しかし、プロセスはそれ自身の環境を変更することができるので、今何が起こるのですか?環境が最初にargvとともにスタックに格納されていることを確認することは自明です。

同様に、実装をチェックするのではなく、なぜあなたはグーグルであろうか。例えば、/ proc/PID/environとそれがターゲットプロセスのアドレス空間から読み取られていることを明確に示すチェックがあります。 http://elixir.free-electrons.com/linux/latest/source/fs/proc/base.c#L908