2016-08-16 2 views
0

私はLinuxカーネルの初心者です。私はいくつかのLinux kerenl 2.6.11メモリ管理do_anonymous_pages(内のコード(plzは私の質問のための私のコードのコメントを確認してください))とコードスライスは以下の通りです:新しいpteエントリを設定した直後にdo_anonymous_page()を呼び出すと、なぜpte_unmap()が呼び出されるのですか?(linux kerenl 2.6.11メモリ管理)

if (write_access) { 
pte_unmap(page_table); 
spin_unlock(&mm->page_table_lock); 
page = alloc_page(GFP_HIGHUSER | _ _GFP_ZERO); 
spin_lock(&mm->page_table_lock); 
page_table = pte_offset_map(pmd, addr); 
mm->rss++; 
entry = maybe_mkwrite(pte_mkdirty(mk_pte(page, 
vma->vm_page_prot)), vma); 
lru_cache_add_active(page); 
SetPageReferenced(page); 
set_pte(page_table, entry);**//here just set new pte entry** 
pte_unmap(page_table);**// why unmap just we set new maped PTE??** 
spin_unlock(&mm->page_table_lock); 
return VM_FAULT_MINOR; 
} 

答えて

1

あなたはpage_tableが最初の場所に移入された方法を読めば、あなたはそれがpte_offset_map-だったが表示されます最初にed。一致するpte_unmapがあることは驚くべきことではありません。

page_tableはここで設定されているものではありません。

むしろ、特定のアーキテクチャでは、カーネルのアドレス空間は非常に限られています。例えば、i386は4GBのメモリをアドレス指定することができます。これは通常、ユーザー空間では3GBに、カーネルでは1GBに分割されます。しかし、すべてのカーネルメモリは通常1GBに収まりません。したがって、問題は、必要に応じて、可能であれば、様々なページを一時的にマッピングおよびアンマップすることによって対処されます。ユーザー空間プロセスのページテーブルは、この動作の対象となります。これらのマクロは、カーネルがすべての物理メモリを恒久的にマップするのに十分なアドレス空間を持つamd64上のものをマップ/アンマップしません。