Linuxプロセス管理について[閉じる]

Linuxプロセス管理について[閉じる]

Linuxカーネルの内部構造、プロセス管理、プロセスのコンテキスト切り替えなどを理解しようとしています。私が理解したチュートリアル(このコミュニティ、IBMなど)によると、電源ボタンを押すとブートローダがカーネルをロードします。次に、スケジューラを起動し、他のすべてのプロセスの開始を担当する最終initプロセスを作成します。

したがって、しばらくするとコンテキスト切り替えが発生します。このコンテキスト切り替えの間、カーネルは新しいプロセスのページテーブルを見て(必要な場合)MMUのTLBにロードします。カーネルはフルページテーブル(32ビットシステムで4 GBの仮想メモリ)をMMUにロードしますか?私が理解したところでは、上位1 GBのメモリがカーネルメモリであるため、すべてのプロセスでスワップアウトされずにそこにあるので、このテーブルスワップはどのように機能しますか?すべてのプロセスのページテーブルには、最初の1GBのメモリへの直接マッピングが含まれているので、最初の1GBの仮想メモリは最初の1GBの物理メモリに直接マッピングされますか?

私のような愚かな奴のためにこれを説明する文書が見つからないので、このコンテキスト切り替えがどのように機能するかについての一種の文書はありますか?

答え1

各プロセスには、32ビットx86システムから下位3GBまでの独自のページセットがあります。 32ビットシステムの最初の1 GBはすべてのプロセスに共通であり、ユーザースペースからアクセスできません。上位 1GB はカーネル用に予約されており、最初は 3 GB の物理 RAM オフセットのマップが含まれています。つまり、物理メモリアドレス0は仮想アドレス0xc0000000で見られ、物理メモリアドレス1はアドレス0xc0000001で見られる式です。メモリサイズが1 GBの制限を超えると、「highmem」ウィンドウを介して超過した物理メモリへのアクセスが開始されます。

x86-64では、アドレス空間の上半分はカーネル用に予約され、下半分はユーザ空間用に予約されています。現在、ハードウェアは64ビットアドレス空間全体の使用を許可していません。通常、48個のアドレスビットのみを使用でき、上位16ビットはすべて0またはすべて1でなければなりません。 (使用可能な正確なビット数はCPUモデルによって異なります。)

コンテキスト切り替え時に、マップのユーザースペース部分は新しいプロセスのマップに置き換えられますが、カーネル部分は変更されません。 4GBのメモリ空間全体がマッピングされず、実際に使用されている部分だけがマッピングされます。これにより、より小さなページテーブルツリーを使用できます。初期マッピングは、実行するプログラムを含むELFファイルによって決まります。新しいメモリが動的に割り当てられるか、マッピングが使用されるmmapか、スタックが自動的に拡張されると、必要に応じてページテーブルが変更されます。

スケジューラは別個のプロセスではないため、「開始」されません。カーネルは、実行中のプロセスが入力または他のイベントを待たなければならないとき、または現在のプロセスがそのタイムスライスを使い果たしたときにプロセスのスケジュールを取り戻します。各プロセスは、イベントの待機、実行の準備、実行など、いくつかの状態のいずれかにあります。カーネルがスケジュールを変更したら、実行する準備が整ったプロセスのリストを確認し、次に実行するプロセス(CPUあたり)を選択します。

また、TLB(変換インデックスバッファ)はカーネル(x86プロセッサ)によって直接ロードされません。ソフトウェアはページテーブルのみを変更し、ハードウェアは実行時に必要に応じてTLBのエントリを自動的に入力します。 TLBはソフトウェアで更新できます。これはコンテキスト切り替えで行う必要があります。

Linuxカーネルの内部についていくつかの本(例:「Linuxカーネルについて」)が書かれていますが、ほとんどはかなり古いものです。しかし、もはや良い参考資料ではありませんが、その多くは関連情報を提供しますが、多くが変わったことを覚えておく必要があります。

関連情報