4

私が理解しているように、「各プロセスのアドレス空間は、ユーザー空間/カーネル空間用に3G/1Gに分割され、1G(少し少ない)は、カーネル論理アドレスと呼ばれる物理アドレスと1対1でマッピングされます」. さて、私の質問は、システム上で実行されている複数のプロセスがあり、すべてのプロセスが物理アドレスと 1 対 1 でマッピングできるようにするにはどうすればよいでしょうか?? たとえば、カーネルがプロセス A のコンテキストでカーネル論理アドレスにアクセスしているときにプリエンプションが発生すると、カーネルがプロセス B のコンテキストで論理アドレスにアクセスするとどうなりますか?

同様に、RAM が 512MB しかない PC の場合はどうなりますか? これらの PC では、1G カーネル空間の 1 対 1 のマッピングはどのように行われますか?

4

3 に答える 3

2

総仮想アドレス空間のカーネル部分 (1GB としましょう) がすべて使用されているわけではないことを最初に考慮することが役立つ場合があります。また、物理メモリの合計がすべてカーネル空間にマップされているわけではありません。

カーネル空間には、使用する物理 RAM の仮想メモリ マッピングと、定義されているメモリ マップされたペリフェラルがあります。それらはページングされていません。

ユーザー空間の各プロセスは、そのコードとデータ用に最大 3 GB の仮想メモリを持つことができます。物理メモリには 2 つの極端な点があり、それぞれを調べると明らかになるかもしれません。

大容量の物理メモリ: プロセッサが 36 ビットなどの大きな物理アドレッシングをサポートしている場合、64 GB の物理メモリが存在する可能性があります。それぞれ 3 GB のコードとデータを持つ複数のプロセスを使用でき、ページをセカンダリ ストレージにスワップする必要さえありません。各コンテキスト スイッチは、MMU をセットアップして、新しい実行プロセスの物理メモリをユーザー空間にマップし直します。

小さな物理メモリ: 512 MB あり、カーネルはそのうちの 128 MB を使用するとします。残りの 384 MB には、ユーザー プロセスのコードとデータが格納されます。ユーザー プロセスがそれ以上を必要とする場合、ページは必要に応じてセカンダリ ストレージと RAM の間でスワップします。

于 2012-10-24T02:23:50.663 に答える
2

これは私の質問をかなり明確にするリンクです。

http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory

「Linux では、カーネル空間が常に存在し、すべてのプロセスで同じ物理メモリをマップします。カーネル コードとデータは常にアドレス可能であり、いつでも割り込みやシステム コールを処理する準備ができています。対照的に、ユーザー モード部分のマッピングは、プロセスの切り替えが発生するたびに、アドレス空間が変更されます:"

質問の最初の部分への回答: Linux カーネル スペースはすべてのプロセスで同じままであり、プロセス コンテキストの切り替えは重要ではありません。カーネル空間は、すべてのプロセス コンテキストで同じ RAM ページにマップされたままになります。

質問の 2 番目の部分への回答: 物理 RAM サイズ (512 MB または 2GB) のサイズは、カーネル アドレス空間とは無関係です。ルールと同様に、カーネルには 1G のカーネル アドレス空間があり、割り当てが何であれ、それらのアドレスで行われます。これらのアドレスを使用可能な RAM (512MB または 2GB) にマッピングするのは、MMU の仕事です。1G 以上の RAM の場合、1G 全体がカーネル アドレス空間にマップされますが、512 MB RAM の場合は 512MB になります。すべてが仮想アドレスであるため、ユーザー空間アドレスに影響を与えることはなく、カーネル空間ページのアドレスを含め、需要に応じてスワップアウトされます。

注: ここでは 1G/3G の分割を想定していますが、これは厳密な規則ではありません。

于 2012-11-20T11:22:53.347 に答える
0

従来のマルチコア システムでは、すべてのプロセッサがすべての RAM にアクセスできます。Linux では、各プロセスは 3GB 側に独自のアドレス空間を持ちますが、カーネルはある意味で常に存在するプロセスであるため、1GB 側は一定のままです (私が思うに)。仮想メモリのカーネル部分は同じままであるため (そのため、カーネル アドレス空間が 1 つあるため)、カーネル アドレス空間は、プロセスをプリエンプトしても変化しません。

簡単に言うと、カーネルはこれらの 512 MB のみをマップします。残りの 512 MB の仮想アドレス空間は、nothing ページ エントリにマップされるだけで、そのアドレスではメモリにアクセスできないことを CPU に通知し、アクセスされるたびに CPU 例外を発生させます。

于 2012-10-21T14:17:10.417 に答える