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

概要

  • mm/memory.cにて定義
  • 引数で渡されたアドレス範囲が属するメモリリージョン内のページ群に物理メモリを割り当てる

引数

  • addr--開始アドレス
  • end--終了アドレス

実装

int make_pages_present(unsigned long addr, unsigned long end) {

	int ret, len, write;
	struct vm_area_struct * vma;
	vma = find_vma(current->mm, addr);
  • addrに対応するメモリリージョンを見つけてvmaに設定する
	if (!vma)
		return -1;
  • 開始アドレスが属するメモリリージョンが存在しない場合は-1を返して終了
	write = (vma->vm_flags & VM_WRITE) != 0;
  • vmaが書き込み可能である場合はwriteに1を設定する。
    • 読み込みのみである場合は0を設定する
	if (addr >= end)
		BUG();
  • 開始アドレスが終了アドレスより大きい場合はバグである
	if (end > vma->vm_end)
		BUG();
  • 終了アドレスが開始アドレスが属するメモリリージョンの終了アドレスより大きい場合はバグである
	len = (end+PAGE_SIZE-1)/PAGE_SIZE-addr/PAGE_SIZE;
	ret = get_user_pages(current, current->mm, addr,
			len, write, 0, NULL, NULL);
  • addrから(addr + len)の間のすべてのページに物理ページが割り当てられているか調べる
	if (ret < 0)
		return ret;
	return ret == len ? 0 : -1;

}

呼出元


履歴

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

コメント



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