os::map_memory(...)

  • ファイルやデバイスをメモリマッピングする
  • 以下、引数の説明
    • fd--メモリマッピングするファイルのファイルディスクリプタ
    • filename--ファイル名
    • file_offset--ファイルのオフセット(このオフセット以降がメモリマッピングされる)
    • addr--マッピングされるメモリの開始アドレス
    • bytes--メモリマッピングされる範囲(file_offsetから(file_offset+bytes)までがマッピングされる)
    • read_only--1なら読み込み可能。0なら読み込み/書き出し可能
    • allow_exec--1なら実行可能。0なら実行不可。
//Linux版(jdk7/hotspot/src/os/linux/vm/os_linux.cpp)
// Map a block of memory.
char* os::map_memory(int fd, const char* file_name, size_t file_offset,
                     char *addr, size_t bytes, bool read_only,
                     bool allow_exec) {
  int prot;
  int flags;

  if (read_only) {
    prot = PROT_READ;
    flags = MAP_SHARED;
  } else {
    prot = PROT_READ | PROT_WRITE;
    flags = MAP_PRIVATE;
  }

  if (allow_exec) {
    prot |= PROT_EXEC;
  }

  if (addr != NULL) {
    flags |= MAP_FIXED;
  }

  //glibcのmmapを呼び出す
  //詳細 -> http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/mmap.2.html
  char* mapped_address = (char*)mmap(addr, (size_t)bytes, prot, flags,
                                     fd, file_offset);
  if (mapped_address == MAP_FAILED) {
    return NULL;
  }
  return mapped_address;
}