このページを編集する際は、編集に関する方針に従ってください。

概要

  • linux2.6/mm/rmap.cにて定義
  • 引数で渡されているページの参照フラグが立っている場合はクリアし、参照数を返す

引数

  • page--ページ
  • vma--メモリリージョン
  • mapcount--pageがアドレス空間にマッピングされている数
  • ignore_token--

実装

/*

* Subfunctions of page_referenced: page_referenced_one called
* repeatedly from either page_referenced_anon or page_referenced_file.
*/

static int page_referenced_one(struct page *page,

	struct vm_area_struct *vma, unsigned int *mapcount, int ignore_token)

{

	struct mm_struct *mm = vma->vm_mm;
	unsigned long address;
  • pageに対応する仮想アドレス
	pgd_t *pgd;
  • ページグローバルディレクトリ
	pmd_t *pmd;
  • ページミドルディレクトリ
	pte_t *pte;
  • ページテーブルエントリ
	int referenced = 0;
  • pageの参照カウント
	if (!mm->rss)
		goto out;
  • mm->rssはmmが使用している実ページ数を表す
    • 0である場合はoutへジャンプ
	address = vma_address(page, vma);
  • メモリリージョンvma内にあるページpageのアドレスを返す
    • メモリリージョン内にページが存在しない場合はエラーコードを返す
    • 詳細はvma_address()/linux2.6を参照
	if (address == -EFAULT)
		goto out;
	spin_lock(&mm->page_table_lock);
  • スピンロックmm->page_table_lockの取得を試みる
    • ロックの取得に失敗した場合は待ち状態に入る
    • 詳細はspin_lock()/linux2.6を参照
	pgd = pgd_offset(mm, address);
  • addressに対応するページグローバルディレクトリを返す
	if (!pgd_present(*pgd))
		goto out_unlock;
	pmd = pmd_offset(pgd, address);
  • ページミドルディレクトリの特定エントリのアドレスを返す
	if (!pmd_present(*pmd))
		goto out_unlock;
  • ページミドルディレクトリpmdがメモリ上に存在する場合は1を返す。そうでない場合は0を返す
	pte = pte_offset_map(pmd, address);
	if (!pte_present(*pte))
		goto out_unmap;
  • ページテーブルエントリpteに対応する物理ページが存在するか判定する
	if (page_to_pfn(page) != pte_pfn(*pte))
		goto out_unmap;
  • ページpageからページフレーム番号を計算し返す
  • ページテーブルエントリpteに対応するページフレーム番号を返す
	if (ptep_clear_flush_young(vma, address, pte))
		referenced++;
  • ページテーブルエントリpteのアクセスフラグをクリアし、参照している(自分を含まない)CPUに対して仮想アドレスaddressに対応するTLBの無効要求を送信する
	if (mm != current->mm && !ignore_token && has_swap_token(mm))
		referenced++;
	(*mapcount)--;

out_unmap:

	pte_unmap(pte);
  • CONFIG_HIGHPTEが無効である場合、処理を行わない

out_unlock:

	spin_unlock(&mm->page_table_lock);
  • スピンロックmm->page_table_lockの開放を行う。プリエンプション機能を有効にし、可能であれば自ら積極的にプリエンプション(実行権の移譲を行うこと)する

out:

	return referenced;

}

呼出元


履歴

  • 作者:ひら
  • 日付:2005/11/25
  • 対象:2.6.10
    更新日更新者更新内容

コメント



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-11-24 (火) 07:16:41 (2861d)