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

概要

  • mm/memory.cにて定義
  • ページミドルディレクトリを引数で渡された仮想アドレスに基づいて選択し、返す

引数

  • mm--メモリディスクリプタ
  • pgd--ページグローバルディレクトリ
  • address--仮想アドレス

実装

/*

* Allocate page middle directory.
*
* We've already handled the fast-path in-line, and we own the
* page table lock.
*
* On a two-level page table, this ends up actually being entirely
* optimized away.
*/

pmd_t fastcall *__pmd_alloc(struct mm_struct *mm, pgd_t *pgd, unsigned long address) {

	pmd_t *new;
	spin_unlock(&mm->page_table_lock);
  • スピンロックmm->page_table_lockの開放を行う。プリエンプション機能を有効にし、可能であれば自ら積極的にプリエンプション(実行権の移譲を行うこと)する
	new = pmd_alloc_one(mm, address);
	spin_lock(&mm->page_table_lock);
  • スピンロックmm->page_table_lockの取得を試みる
    • ロックの取得に失敗した場合は待ち状態に入る
    • 詳細はspin_lock()/linux2.6を参照
	if (!new)
		return NULL;
	/*
	 * Because we dropped the lock, we should re-check the
	 * entry, as somebody else could have populated it..
	 */
	if (pgd_present(*pgd)) {
		pmd_free(new);
		goto out;
	}
	pgd_populate(mm, pgd, new);

out:

	return pmd_offset(pgd, address);
  • ページミドルディレクトリの特定エントリのアドレスを返す

}

呼出元


履歴

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

コメント



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