揮発性のメモ2

知識をメモ書きしておく

mmapについて

Amazon | POSIX.4 Programmers Guide: Programming for the Real World | Gallmeister, Bill | Unix
この本がほしい

MAP_PRIVATE はファイルに反映されない

いじっている間はファイルに絶対反映されないけど、munmap()すれば反映される。 と思い込んでた。

Man page of MMAP
マニュアルをいくら読んでもわからなかったので随分悩んだ。
mmap - Wikipedia
でもWikipediaにはそのものずばり書いてある。

ファイルサイズは勝手に大きくならない

小さいファイルをmmap()して後ろの方になんか書いたら反映されて ファイルもついでに拡張されないかなー と期待してた。
なんならサイズが 0 のファイルでアクセスした日には バスエラーまで起こる。

サイズをページサイズに合わせる

アライメント(バイト境界)

    int size = 4097;
    int pagesize = sysconf(_SC_PAGESIZE); // ほぼほぼ 4096
    int alignedsize = ((size-1)/pagesize + 1) * pagesize; // この例なら 8192 になる

いちいち (size/pagesize + (size%pagesize!=0)) * pagesize とかやってたけど、この方が短くてかっこいい

サイズをページサイズに合わせなくても大丈夫

mmap() のときのlengthは ページサイズに勝手に切り上げて合わせるよ! とマニュアルに書いてあるけど、
munmap() にはページサイズに合わせなさい。 と書いてあるので、マジかよ面倒くさいと思っていた。
が、単に誤読で、ページサイズにあわせないといけないのはアドレスだった。

サイズの方は内部で勝手に切り上げてるっぽいので平気。 よって、ページサイズを使ってサイズ計算する必要は無くなった

linux/mmap.c at master · torvalds/linux · GitHub

int __do_munmap(struct mm_struct *mm, unsigned long start, size_t len, struct list_head *uf, bool downgrade)
{
	unsigned long end;
	struct vm_area_struct *vma, *prev, *last;

	if ((offset_in_page(start)) || start > TASK_SIZE || len > TASK_SIZE-start) return -EINVAL;

	len = PAGE_ALIGN(len);
以下略