最も重要な mmap() 機能は、ファイル マッピングが多くのプロセス間で共有されることであることが広く知られています。しかし、すべてのプロセスが独自のアドレス空間を持っていることはあまり知られていません。
問題は、memmap されたファイル (より具体的にはそのデータ) が実際にどこに保存されているか、プロセスがこのメモリにアクセスするにはどうすればよいかということです。*(pa+i) やその他の高レベルのものではなく、プロセスの内部を意味します。
最も重要な mmap() 機能は、ファイル マッピングが多くのプロセス間で共有されることであることが広く知られています。しかし、すべてのプロセスが独自のアドレス空間を持っていることはあまり知られていません。
問題は、memmap されたファイル (より具体的にはそのデータ) が実際にどこに保存されているか、プロセスがこのメモリにアクセスするにはどうすればよいかということです。*(pa+i) やその他の高レベルのものではなく、プロセスの内部を意味します。
これは、オペレーティング システムの仮想メモリ管理レイヤーで発生します。ファイルをメモリマップすると、メモリマネージャーは基本的にファイルをプロセスのスワップスペースであるかのように扱います。仮想メモリ アドレス空間のページにアクセスすると、メモリ マッパーはページを解釈して物理メモリにマップする必要があります。ページ境界を超えると、ページ フォールトが発生する可能性があります。このとき、OS はディスク領域のチャンクを物理メモリのチャンクにマップし、メモリ マッピングを解決する必要があります。mmap を使用すると、独自のスワップ スペースではなく、ファイルから単純にそうします。
これがどのように行われるかについて多くの詳細が必要な場合は、実装の詳細が異なるため、使用しているオペレーティング システムをお知らせください。
すべてのデータは、何らかの形式のメモリまたはその他の形式になります。HDD の場合もあれば、組み込みシステムの場合は、フラッシュ メモリまたは RAM (initramfs) の場合もあります。最後のものを除いて、メモリ内のデータは頻繁に RAM にキャッシュされます。 RAM はページに論理的に分割され、カーネルはページを一意に識別する記述子のリストを維持します。
したがって、データへのアクセスはせいぜい物理ページへのアクセスです。プロセスは、アドレス空間内のマップされたセクションを識別する多くの vm_are_struct で構成される独自のプロセス アドレス空間を取得します。mmap の呼び出しでは、アドレスが隣接している場合、新しい vm_area_struct が作成されるか、既存のものとマージされる場合があります。
新しい仮想アドレスが mmap への呼び出しに返されます。また、新しく作成された仮想アドレスから実際のデータが存在する物理アドレスへのマッピングで構成される新しいページ テーブルが作成されます。マッピングは、ファイルに対して行うことも、malloc のように匿名で行うこともできます。プロセスのアドレス空間構造体 mm_struct は、pgd_t (ページ グローバル ディレクトリ) のポインターを使用して、物理ページに到達し、データにアクセスします。