8

struct pageページにキャッシュされたファイルのアドレス空間からを取得したとしましょう。

これから4KBデータの開始物理アドレスを取得するにはどうすればよいstruct pageですか?

data中にポインタのようなものがあるはずなstruct sk_buffのに、見つかりませんでした。


編集

答えてくれたMatとllyaに感謝します。

答えを見た後、最初の問題は、がにあるか、struct pageにあるZONE_NORMALかを識別することだと思いますZONE_HIGHMEM

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

それで

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

正してください。

4

1 に答える 1

3

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

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

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

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

于 2012-04-04T12:37:43.797 に答える