2012-03-09 6 views
1

私はすべてのpteを指定してvm_area_structに書き込み禁止する関数を書こうとしています。指定されたアドレスに対して私にptepを与える機能は何ですか?私は持っています:特定のアドレスのptepを見つけるにはどうすればよいですか?

pte_t *ptep; 
for (addr = start; addr < end; addr += PAGE_SIZE) { 
    ptep = WHATS_THIS_FUNCTION_CALLED(addr); 
    ptep_set_wrprotect(mm, addr, ptep); 
} 

WHATS_THIS_FUNCTION_CALLEDとは何ですか?

+0

どうfollow_page 'について()' FOLL_GET'フラグ 'で?.. –

答えて

1

あなたの質問に対する短い答えは__get_locked_pteです。しかし、私はあなたの目標を達成するための方がはるかに優れている(リソースの競合に関して効率的かつ公平である)方法があるので、それに対して助言するだろう。

linuxでは、ページテーブルを走査する典型的なイディオムは、ネストされたforループが4レベル深いものです(4つはLinuxがサポートするページテーブルレベルの数です)。例については、copy_page_rangeおよびapply_to_page_rangein mm/memory.cを参照してください。実際、copy_page_rangeをよく見ると、kernel/fork.cのdup_mmapからフォークするときに呼び出されます。基本的にvm_area_struct全体で動作します。

これらの機能のいずれかで使用されているイディオムを複製することができます。しかし、いくつかの注意点があります。たとえば、copy_page_rangeは、完全に別のcopy_huge_pmdcopy_pmd_rangeの内側に使用することによって、透過的なhugepages(2.6.38)を完全にサポートします。 2つの別々の関数(普通のページと透明なページのためのもの)を書く必要がなければ、Documentation/vm/transhuge.txtGracefull fallbackを参照してください。

ポイントは、Linuxの仮想メモリは非常に複雑ですので、ケース。follow_pagemm/memory.cでは、あなたの拠点のすべてをカバーする方法を示さなければならない。

+1

また' pagewalk'メカニズムは、開始点として使用することができます。[を見てくださいmm/pagewalk.c](http://lxr.linux.no/linux+v3.2.9/mm/pagewalk.c#L189)。 –

+0

'pagewalk'メカニズムは私が探していたものでした! –

0

virt_to_pteと定義されているhereのいずれか、または独自の再実装を探していると思います。

この関数は、pte_offset(pmd_t * dir, unsigned long address)を使用することもできますが、pmd(ページ中間レベルディレクトリ)構造とアドレスをとるpte_offset_kernel(pmd_t * dir, unsigned long address)を使用します。

Linux Device Drivers 3rd Edition Chapter 15またはLinux Device Drivers, 2nd Edition Chapter 13 mmap and DMAを参照してください。

関連する問題