今のところの理解
int fd; char * addr; fd = open("/Users/amachang/hoge", O_RDONLY); addr = mmap(0, size, PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fd, 0); close(fd);
こんな感じでやると、 hoge っていうファイルと addr から始まるメモリがちょうどスワップファイルとページの関係になる。
つまり、実際はファイルとメモリの番地は関連付けられただけで、アクセスするとページフォルト割り込みが発生してその都度読みにいく。
他のプロセスが既にこのファイルを mmap してたら同じ物理アドレスを指す仮想アドレスが帰ってくる。(仮想アドレスは違うけど、物理アドレスは同じ)
MAP_PRIVATE が指定されている場合、プロセスがメモリの内容を変更するとその場でメモリのコピーが生成され他のプロセスには反映されない。(Copy-on-write)
メモリのコピーが生成されてアドレスが変わるのは物理メモリ上の話なので、仮想メモリ上は何も変わらない。