9

64 ビット ボックスの Linux 2.6.32 でのプロセス実行について調べています。の出力を調べているときに/proc/$PID/maps、1 つのことを観察しました。

$ cat /proc/2203/maps | head -1
00400000-004d9000 r-xp 00000000 08:02 1050631              /bin/bash

$ cat /proc/27032/maps | head -1
00400000-00404000 r-xp 00000000 08:02 771580               /sbin/getty

すべてのプログラムのmapsファイルは、各プログラムの実行可能コードが から始まるメモリ ブロックにロードされていることを示しているようです0x00400000

これらが仮想アドレスであることは理解しています。ただし、これらのアドレスが複数の同時実行プロセスでどのように同じになるかはわかりません。すべてのプロセスをロードするために共通の開始アドレスを使用する理由は何ですか? また、OS はプロセス間の仮想ロード ポイントをどのように区別しますか?

編集:

ページングを使用したアドレス空間の仮想化に関する私の理解から、仮想アドレスの一部は、メモリ ブロック (フレーム) の物理アドレスを検索するために使用され、それを使用して 1 つ以上のページ テーブルにインデックスを付けることができると考えました。この場合を考えてみましょう。アドレスは 32 ビットに見えます (これは私を困惑させるもう 1 つのことです。プログラムのアドレスは 32 ビットなのに、ロードされたライブラリのアドレスは 64 ビットなのはなぜですか?)。ページ ディレクトリ エントリ、ページ テーブル エントリ、およびページ オフセットにそれぞれ対応する 10、10、および 12 ビットにアドレスを分割することは、0x00400000常に「ページ ディレクトリ エントリ 1、ページ テーブル エントリ 0、オフセット 0」を意味するわけではありません。アドレス変換を実行するプログラムは何ですか?

これがどのように行われるかを確認する方法の 1 つは、OS がページ ディレクトリ エントリ #1 を変更して、タスク スイッチが実行されるたびにプログラムに対応するページ テーブルを指すようにすることです。その場合、複雑さが増しているように思えます。プログラム コードが位置に依存しないことを考えると、プログラムを任意の仮想アドレスにロードしてそこから移動する方が簡単ではないでしょうか?

4

2 に答える 2

8

その答えは、各プロセスには独自のページ テーブルがあるということです。プロセスが切り替わると切り替えられます。

詳細については、http://www.informit.com/articles/article.aspx?p=101760&seqNum=3を参照してください。

コンテキスト スイッチが発生すると、カーネルはページ テーブルを切り替えます。カーネルがすべてのプロセスにマップされているオペレーティング システムでは、カーネル ページを残すことができます。一方、ユーザー プロセスに 4GiB を提供するオペレーティング システム (32 ビット) は、カーネル (syscall) に入るときにもコンテキスト スイッチを実行する必要があります。

仮想アドレス指定では、異なるプロセスが異なるページ テーブルを持つ必要はありませんが (依存関係は逆になります)、各プロセスに独自のページ テーブルを与えない現在のオペレーティング システムは考えられません。

于 2012-06-01T12:56:42.090 に答える
5

Q: これらが仮想アドレスであることは理解しています。

良い...

Q: しかし、複数の同時実行プロセスでこれらのアドレスが同じになる方法がわかりません。

A: 「仮想アドレス」を理解していると言ったと思います ;)?

Q: すべてのプロセスをロードするために共通の開始アドレスを使用する理由は何ですか?

A: これは仮想アドレスであり、物理アドレスではないことに注意してください。標準的な開始アドレスを持たないのはなぜですか?

そして覚えておいてください - 開始アドレスを "0" にしたくない - プロセスが物理アドレスであるかのようにマッピングしたい特定の仮想アドレス (特に 640K 未満のもの) がたくさんあります。

これは、これらの問題のいくつかに触れている良い記事です。「e_entry」を含む:

Linux での main() の実行方法

于 2012-06-01T05:37:22.497 に答える