mmap()
開いたファイルの内容をそのユーザースペースにマップします。
1.説明
「ファイルマップのユーザースペース」とはどういう意味ですか?
Linuxカーネルでは、物理メモリはページサイズの単位でメモリに保持されますが、ページメモリ管理とは、仮想アドレス0xAが与えられた場合、ページマッピング後に、物理メモリに対応するページアドレスを見つけることができることを意味します。 。データが実際に保存される場所。
Linuxのメモリ管理はページを1つの単位として受け取ります。もちろん、ユーザースペースの管理も1つのページとして行われ、各仮想メモリアドレスは特定のページに対応します。
次に、上記の文は、仮想アドレスからページへのマッピングがユーザースペースで確立され、ファイルのコンテンツがメモリ内の指定されたページに読み取られることを意味します。これにより、プログラムは仮想アドレスを介してページ上のファイルを見つけることができます。次に、ページマッピングを介して。のコンテンツ。
次に、ファイルの内容もメモリに読み込まれますが、read()と通常のファイル読み取りの違いは何ですか?
a。読み取り方法が異なります。mmap()がファイルコンテンツを読み取る方法は、ページフォールト割り込みを介して行われます。仮想アドレスに対応するページマッピングが確立されていないことが判明した場合、ファイルコンテンツはに読み取られます。ページフォールト割り込みによる仮想メモリアドレス。マップされたページ内。
通常のファイル読み取りは、read()を介してファイルの内容を読み取ることです。
b。アクセス方法が異なります。mmap()の後、ファイルコンテンツへのアクセスはフェッチと同じくらい簡単です。
2.主な手順
mmap(void * start、size_t length、int prot、int flags、int fd、off_t offset)
1.サイズの長さのマップされていない仮想ストレージスペースの一部を見つけます
2.見つかった仮想メモリ空間にvm_area_struct構造体を割り当てます。これは、後でメモリページに読み込まれるファイルの内容をマップするために使用されます。
3. vm_area_structのvm_pgoffをoffsetに設定するなど、vm_area_structの各メンバー情報を設定します。これにより、ページフォールトが発生したときに、ファイルの内容がファイルoffsetvm_pgoffから指定されたページに読み取られます。
4.このvm_area_struct構造体をこのプロセスのvm_area_structキューに挿入します
5.終了
これが最後か?特定のファイルをメモリに読み込む動作が見られませんでしたか?vm_area_structに対応するページマッピングも確立されておらず、ページが割り当てられていません。
実際、ここでのmmap()は、仮想ストレージ構造vm_area_structを確立するためのものです。そして、ファイルの内容を実際に読み取る必要があるまで実際のページマッピングを延期し、ページフォールトが異常になるように読み取ります。これの利点は、マッピングが確立された後にプログラムがファイルの内容にアクセスできない可能性があるため、不要なファイルの読み取りを回避することです。一方、不要なメモリページのオーバーヘッドを節約します。そうしないと、ページが頻繁にスワップインおよびスワップアウトする可能性があります。
参考資料: