12

同じアドレスから開始するマッピングは複数存在できないため、マップされたメモリのサイズを1つのパラメーターとして渡す必要があるのはなぜか、Linuxカーネルは開始アドレスと長さの両方を一緒に記録しないのはなぜでしょうか。 、ただし、ユーザースペースプログラムにそれらを記憶させます。

つまり、情報ツリーを格納するための主キーとして開始アドレスを使用するだけです。

4

2 に答える 2

10

1 つはmap、たとえば 5 ページと、unmapそのうちの 1 ページです。また、マップを解除するページに関する情報は、アドレスと長さとして渡されます。長さはページ サイズの倍数です。

于 2012-08-22T15:28:06.873 に答える
7

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]);
}
于 2012-08-22T15:31:20.667 に答える