2

私は関数と混同しています:

void * page_address(struct page *page)

これは、(1)「LinuxKerenl開発第3版」に従って「特定のページを論理アドレスに変換する」(2)「Linuxカーネルを理解する>>」に従って「ページフレームに関連付けられた線形アドレスを返す」(3) 「Linux仮想メモリマネージャを理解する」に従って「ページの物理アドレスを返す」

では、どちらが正しいですか?

(1)を見てみましょう:この関数は物理ページ(ページフレーム)へのポインターを取りますが、そのポインターはすでに「そのページフレームに関連付けられた論理アドレス」ではありませんか?そのポインタ値と戻り値の違いは何ですか?ありがとう。

4

3 に答える 3

10

1と2はどちらも正しいです-同じことを言う2つの方法です(説明2の方が明確ですが)。説明3が正しくありません-page_address()ページフレームの物理アドレスではなく、仮想アドレスを返します。

page_address()ページ/ページフレームへのポインタを取りません。struct pageこれは、ページを表すカーネルデータオブジェクトである、へのポインタを取ります。

于 2012-07-23T04:01:03.887 に答える
2

page_address()は、ページの仮想アドレスを返します。

http://lxr.free-electrons.com/source/mm/highmem.c#L408

/**
 * page_address - get the mapped virtual address of a page
 * @page: &struct page to get the virtual address of
 *
 * Returns the page's virtual address.
 */
 void *page_address(const struct page *page)
 {
          unsigned long flags;
          void *ret;
          struct page_address_slot *pas;

          if (!PageHighMem(page))
                  return lowmem_page_address(page);

          pas = page_slot(page);
          ret = NULL;
         spin_lock_irqsave(&pas->lock, flags);
         if (!list_empty(&pas->lh)) {
                 struct page_address_map *pam;

                 list_for_each_entry(pam, &pas->lh, list) {
                         if (pam->page == page) {
                                 ret = pam->virtual;
                                 goto done;
                         }
                 }
         }
 done:
         spin_unlock_irqrestore(&pas->lock, flags);
         return ret;
}
于 2017-04-05T11:42:03.613 に答える
-1

page_address()は、仮想アドレスではなく、物理アドレスを返します。

https://www.kernel.org/doc/gorman/html/understand/understand023.html

于 2014-02-22T22:44:34.243 に答える