元のUnixカーネルはどのようにメモリをアドレス指定しますか?

元のUnixカーネルはどのようにメモリをアドレス指定しますか?

今日、ほとんどすべてのカーネルはMMUが提供する仮想メモリを使用しています。これは、グローバルページテーブル(アドレスがCPUレジスタにある)とページ間ページマネージャ/マッパーを使用してこれを行います。たとえば、「vm」はvmlinuzLinux カーネルが仮想メモリをサポートしていることを示します。

これは、MMU が連続するメモリアドレスを x86 アーキテクチャが理解するメモリセグメントにマッピングするために可能です。

実際にもともと UNIX カーネルバージョンがありましたがvmunix、同様の技術を使用したと考えられます。しかし、もともとUNIXカーネルはMMUが利用可能になる前に書かれていました。私の記憶が正しい場合、元のUNIXカーネル(短くUNIXカーネルunix)はx86アーキテクチャが存在する前に作成されました。歴史的にPDP-9とPDP-11で実行されています。

このカーネルはどのようにメモリアドレッシングと管理を行いますか?セグメントベースのアドレッシング(2つの数字)ですか、それとも完全なメモリアドレッシング(単一の数字)ですか?処理間でメモリをどのように分離しますか?

ベストアンサー1

仮想メモリはUnixよりほぼ10年前です。バロスB50001961.現代的な意味(つまりページベース)のMMUではありませんが、同じ基本機能を提供します。IBMシステム/360モデル67MMUは1965年(Unixより古い)から存在してきました。 Intel x86プロセッサは、1986年に80386が出るまでMMUを取得できませんでした。

MMUは実際にUnixシステムを実装するために必要ではありません。ある種の仮想メモリが必要です。それ以外の場合は実装が必要です。forkシステムコールとても難しいです。fork既存のプロセスをコピーしてプロセスを生成するシステムコールは、最初のバージョンからUnixの基本部分なので、仮想メモリが必要です。バラよりDMリッチ(Ritchie)とK.トンプソン(K. Thompson)、UNIX時間共有システム、CACM、1974、§V「プロセスとイメージ」。

私はUnixの最初のバージョンが実行されたハードウェアの詳細を知りませんが、仮想メモリの形式を持っていました。分割アーキテクチャ。 CPUは、プログラムが参照したポインタ(仮想アドレス)とメモリの実際の位置(物理アドレス)との間を変換します。仮想アドレスにオフセットを追加してマッピングを実行します。プロセス間のすべてのコンテキスト遷移において、オフセットを含むレジスタが調整される。

ほとんどすべてのUnix実装はプロセス分離を提供しますが、メモリ保護を持たないいくつかの歴史的ハードウェア実装はそうではありませんでした(1970年代または1980年代)。ミニX8088および80286)。メモリ保護は、仮想化を処理するのにかなり直交します。 MMUは両方の機能を提供できますが、単純な分割アーキテクチャはそうではなく、MPU1は仮想化なしで保護を提供できます。 MMUを持たないシステムでは、Linux実装があります。uCLinuxただし、fork多くのプログラムが見つからないため実行できません(サポートされている唯一のプログラムはfork次のとおりです)。vforkこれを行うにはexecveその後すぐに子供を呼んでください。)

1 MPU(Memory Protection Unit)は、メモリ内の各ページへのアクセス権を記録します。

おすすめ記事