3

基本的に、ページを使用してプロセスまたはタスクを識別し、それに応じて、ページのスワップアウトを許可するかどうかについていくつかの決定を行う必要があります。カーネルAFAIKのスワップモジュールは主に構造体ページを処理するため、私が見逃している既存のトリックがあるかどうか疑問に思いました。include / linux / mm_types.h(v> = 2.6)から、次のコメント:

  • システム内の各物理ページには、に関連付けられた構造体ページがあります
  • でページを使用しているものを追跡するために
  • 一瞬。どのタスクが使用しているかを追跡する方法がないことに注意してください
  • ページ、ただし、それがページキャッシュページの場合、rmap構造は私たちに教えてくれます
  • 誰がそれをマッピングしていますか。

いくつかの物理から仮想への逆マッピングを介してこれを行うことができることを示唆していますが、rmap関数(mm / rmap.c)から私が探しているものを達成する方法を理解できませんでした。

助けてくれてありがとう、大いに感謝します。

4

2 に答える 2

2

「構造体ページから構造体 vm_area_struct を取得する方法」という実際の質問に答えるには、少なくとも 2 つの答えがあります。

匿名ページの場合はpage_anon_vma()、 を返すを使用できます。(スペースを節約するために)ではないことを示す特別なフラグが設定されてanon_vma格納されます。page->mappingstruct address_space

からと 各エントリ ポイントを までanon_vma歩くことができます。から、タスクを取得できます。anon_vma_chainvmavmamm

例については、を参照page_referenced_anon()してください。

であるファイルページを見てpage->mapping、そこから であるstruct address_spaceを歩きます。を参照してください。i_mmapstruct prio_tree_rootpage_referenced_file()

それが実際にあなたのアイデアを実装するのに役立つかどうかはわかりませんが、そうです。

于 2012-04-22T11:28:27.933 に答える
1

このようなものはおそらくあなたが望むものです。

これはプロトタイプです:

// [ http://lxr.free-electrons.com/source/include/linux/rmap.h#L27 ]
149 struct anon_vma *page_get_anon_vma(struct page *page);

使用方法は次のとおりです。 // [ http://lxr.free-electrons.com/source/mm/ksm.c#L1898 ] // [...]

        anon_vma = page_get_anon_vma(page);
1902    anon_vma_lock_read(anon_vma);
1903    anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root,
1904                                                0, ULONG_MAX) {
1906                         vma = vmac->vma;
1907                         if (page_address < vma->vm_start ||
1908                             page_address >= vma->vm_end)
1909                                 continue;
[...]   }
        anon_vma_unlock_read(anon_vma);
于 2016-04-02T04:20:14.363 に答える