同じアドレスから開始するマッピングは複数存在できないため、マップされたメモリのサイズを1つのパラメーターとして渡す必要があるのはなぜか、Linuxカーネルは開始アドレスと長さの両方を一緒に記録しないのはなぜでしょうか。 、ただし、ユーザースペースプログラムにそれらを記憶させます。
つまり、情報ツリーを格納するための主キーとして開始アドレスを使用するだけです。
1 つはmap
、たとえば 5 ページと、unmap
そのうちの 1 ページです。また、マップを解除するページに関する情報は、アドレスと長さとして渡されます。長さはページ サイズの倍数です。
munmap
以前にマップしたメモリ アドレスの部分範囲を指定できます。例えば:
#include <stdio.h>
#include <sys/mman.h>
#include <unistd.h>
int main()
{
int pagesize = sysconf(_SC_PAGESIZE);
char *addr = mmap(NULL, 4 * pagesize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
addr[pagesize] = 'X';
munmap(addr, pagesize);
printf("%c\n", addr[pagesize]);
}