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

概要

  • mm/init.cにて定義
  • 引数で与えられたページグローバルディレクトリのエントリに対応するページミドルディレクトリのテーブルを設定し、テーブルのアドレスを返す。

引数

  • pgd--ページグローバルディレクトリのエントリ

実装

/*

* Creates a middle page table and puts a pointer to it in the
* given global directory entry. This only returns the gd entry
* in non-PAE compilation mode, since the middle layer is folded.
*/

static pmd_t * __init one_md_table_init(pgd_t *pgd) {

	pmd_t *pmd_table;
		

#ifdef CONFIG_X86_PAE

  • PAEが有効である場合:
	pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
  • bootmemアロケータからメモリ領域を確保する
  • alloc_bootmem_low_pages(x) は __alloc_bootmem_node(NODE_DATA(0), (x), PAGE_SIZE, 0)と定義されている
	set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
  • pgdテーブルにpmdエントリを設定する
  • 仮想アドレスから物理アドレスへ変換する
  • __pgd(x)は((pgd_t) { (x) } )と定義されており、pgd_tはPAEが有効時に64bit整数(long long)でPAEが無効時には32bit整数(long)である
  • PAE有効時、set_pgd(pgdptr,pgdval) は set_64bit( (unsigned long long *)(pgdptr),pgd_val(pgdval) )のように定義されている
	if (pmd_table != pmd_offset(pgd, 0)) 
		BUG();
  • ページミドルディレクトリの0番目のエントリ(つまりページミドルディレクトリのテーブル)のアドレスを返す
  • bootmemアロケータから確保したメモリ領域をpgdに設定したので、pmd_table と pmd_offset(pgd, 0)は等しくなるはずであるが、等しくない場合はバグである

#else

	pmd_table = pmd_offset(pgd, 0);
  • ページミドルディレクトリの0番目のエントリ(つまりページミドルディレクトリのテーブル)のアドレスを返す

#endif

	return pmd_table;

}

呼出元


履歴

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

コメント



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