IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

mmap の話

今のところの理解

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)
メモリのコピーが生成されてアドレスが変わるのは物理メモリ上の話なので、仮想メモリ上は何も変わらない。

ここで勉強しました

http://funini.com/kei/mmap/