概要


ページテーブルのエントリを変更する。

引数

  • page: ページの開始アドレス。
  • toclear: 削除するフラグ。
  • toset: 設定するフラグ。

戻り値


成功したら0, 失敗したら-1.

64ビットの場合


static int caml_page_table_modify(uintnat page, int toclear, int toset)

{
  uintnat h;

  Assert ((page & ~Page_mask) == 0);

  /* Resize to keep load factor below 1/2 */

負荷率を1/2以下にするためにサイズを変更する。

  if (caml_page_table.occupancy * 2 >= caml_page_table.size) {

    if (caml_page_table_resize() != 0) return -1;

  }
  h = Hash(Page(page));

  while (1) {
    if (caml_page_table.entries[h] == 0) {

空のエントリが見つかった場合

      caml_page_table.entries[h] = page | toset;
      caml_page_table.occupancy++;
      break;
    }
    if (Page_entry_matches(caml_page_table.entries[h], page)) {

既存のエントリが見つかった場合

      caml_page_table.entries[h] =
        (caml_page_table.entries[h] & ~toclear) | toset;
      break;
    }
    h = (h + 1) & caml_page_table.mask;

空のエントリが見つからなかった場合は、リハッシュする。

  }
  return 0;
}

32ビットの場合


static int caml_page_table_modify(uintnat page, int toclear, int toset)
{
  uintnat i = Pagetable_index1(page);

  uintnat j = Pagetable_index2(page);


  if (caml_page_table[i] == caml_page_table_empty) {

    unsigned char * new_tbl = calloc(Pagetable2_size, 1);

    if (new_tbl == 0) return -1;
    caml_page_table[i] = new_tbl;
  }
  caml_page_table[i][j] = (caml_page_table[i][j] & ~toclear) | toset;
  return 0;
}
タグ

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

管理人/副管理人のみ編集できます