*参照元 [#h6067d19] #backlinks *説明 [#m51ecb99] -パス: [[linux-4.4.1/mm/mmap.c]] -FIXME: これは何? --説明 **引数 [#g200bdfc] -unsigned long addr -- -unsigned long len -- -unsigned long prot -- -unsigned long flags -- -unsigned long fd -- -unsigned long pgoff -- **返り値 [#mfd9b0d1] -unsigned long -- **参考 [#i39d9053] *実装 [#y9b64e6e] 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; - --[[linux-4.4.1/file]] if (!(flags & MAP_ANONYMOUS)) { audit_mmap_fd(fd, flags); file = fget(fd); if (!file) return -EBADF; - --[[linux-4.4.1/MAP_ANONYMOUS]] --[[linux-4.4.1/audit_mmap_fd()]] --[[linux-4.4.1/fget()]] if (is_file_hugepages(file)) len = ALIGN(len, huge_page_size(hstate_file(file))); - --[[linux-4.4.1/is_file_hugepages()]] --[[linux-4.4.1/ALIGN()]] --[[linux-4.4.1/huge_page_size()]] --[[linux-4.4.1/hstate_file()]] retval = -EINVAL; if (unlikely(flags & MAP_HUGETLB && !is_file_hugepages(file))) goto out_fput; - --[[linux-4.4.1/unlikely()]] --[[linux-4.4.1/MAP_HUGETLB]] } else if (flags & MAP_HUGETLB) { struct user_struct *user = NULL; struct hstate *hs; - --[[linux-4.4.1/user_struct]] --[[linux-4.4.1/hstate]] hs = hstate_sizelog((flags >> MAP_HUGE_SHIFT) & SHM_HUGE_MASK); if (!hs) return -EINVAL; - --[[linux-4.4.1/hstate_sizelog()]] --[[linux-4.4.1/MAP_HUGE_SHIFT]] --[[linux-4.4.1/SHM_HUGE_MASK]] len = ALIGN(len, huge_page_size(hs)); /* * VM_NORESERVE is used because the reservations will be * taken when vm_ops->mmap() is called * A dummy user value is used because we are not locking * memory so no accounting is necessary */ file = hugetlb_file_setup(HUGETLB_ANON_FILE, len, VM_NORESERVE, &user, HUGETLB_ANONHUGE_INODE, (flags >> MAP_HUGE_SHIFT) & MAP_HUGE_MASK); if (IS_ERR(file)) return PTR_ERR(file); - --[[linux-4.4.1/hugetlb_file_setup()]] --[[linux-4.4.1/HUGETLB_ANON_FILE]] --[[linux-4.4.1/VM_NORESERVE]] --[[linux-4.4.1/HUGETLB_ANONHUGE_INODE]] } flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE); retval = vm_mmap_pgoff(file, addr, len, prot, flags, pgoff); - --[[linux-4.4.1/MAP_EXECUTABLE]] --[[linux-4.4.1/MAP_DENYWRITE]] --[[linux-4.4.1/vm_mmap_pgoff()]] out_fput: if (file) fput(file); return retval; - --[[linux-4.4.1/fput()]] } *コメント [#qbb1a95c]