概要
mmapを読もうと思ったのでその開始地点のメモ。迷子になったらここに戻ってくるように書いておく
mmapの実装
asmlinkage long sys32_mmap(struct mmap_arg_struct32 __user *arg) { struct mmap_arg_struct32 a; if (copy_from_user(&a, arg, sizeof(a))) return -EFAULT; if (a.offset & ~PAGE_MASK) return -EINVAL; return sys_mmap_pgoff(a.addr, a.len, a.prot, a.flags, a.fd, a.offset>>PAGE_SHIFT); }
実際の処理はsys_mmap_pgoff()のようなので、これを見る。
SYSCALL_DEFINE6(mmap_pgoff, unsigned long, addr, unsigned long, len, unsigned long, prot, unsigned long, flags, unsigned long, fd, unsigned long, pgoff) { struct file *file = NULL; unsigned long retval = -EBADF; if (!(flags & MAP_ANONYMOUS)) { /* * ここは要するに、file構造体を取得したりとバッキングストア * となるファイルを扱うためのデータを準備するのが主 * よって、略 */ } else if (flags & MAP_HUGETLB) { /* 本当は面白そうなところだけれど、概要をつかむことを優先するため略 */ } flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff); out_fput: if (file) fput(file); out: return retval; }