2012-04-04 7 views
7

ページキャッシュファイルのアドレス空間からstruct pageを取得したとします。構造ページから関連するデータの物理アドレスを取得する方法は?

この4バイトデータの開始物理アドレスはどのように取得できますかstruct page

struct sk_buffの中にdataポインタがあるはずですが、見つからなかったと思います。


EDIT

答えてくれてありがとうマットとllya。

答えを見てみると、struct pageZONE_NORMALにあるのか、ZONE_HIGHMEMにあるのかを特定するのが最初の問題だと思います。

ファイルI/O中にキャッシュされたページが見つからない場合は、最初にpage_cache_alloc_cold()を使用して新しいページを割り当てます。 page_cache_alloc_cold()は、(x86では、PAGE_OFFSET + 896Mで始まるカーネルメモリ領域)を使用するように見えるalloc_pages()を最終的に呼び出します。

ので

  • 私はZONE_NORMAL
  • 内のページは、我々は構造体のページに関連付けられた4KBのデータの開始物理アドレスを見つけるためにkmap()を使用し、それは我々がすべきことを正しいと仮定するためにマットの答えは適していると思います(unsigned long)(&page)-PAGE_OFFSETを使用して、構造自体を格納する物理アドレスを見つけますか?

修正してください。

+0

'mem_map'配列のアイテムとして' page'を考えてみましょう。 –

答えて

1

次のようにカーネルメモリにpageをマップする必要があります。

void * mapping = kmap_atomic(page, KM_USER0); 
// work with mapping... 
kunmap_atomic(mapping, KM_USER0); 

LinuxではHighMemory概念があるとして、このトリックが必要です(例のためthisのリンクを参照してください。)。

UPD:非アトミックなコンテキストでkmap_atomicの代わりにkmapを使用できます。

+1

OPは彼がすでに 'struct page 'を持っていると言っています。なぜそれを正確にマップする必要があるのですか? (BTW:http://lwn.net/Articles/356378/ kmap_atomicへの2番目の引数は2009 afaictで少し時間がかかりました) – Mat

+0

さて、HighMemoryを扱う際にはいくつかの制約があります。一般的な32ビットカーネルは1Gのメモリしか見ることができません(0xc000000以降)。それで、あなたは4G以上のRAMを持っていると想像してください。カーネルからどのようにアクセスしますか? –

関連する問題