地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Linux】mmapリーディングの開始地点あたりのメモ

概要

mmapを読もうと思ったのでその開始地点のメモ。迷子になったらここに戻ってくるように書いておく

github.com

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;
}

linuxjm.osdn.jp