2

我对这个功能感到困惑:

void * page_address(struct page *page)

其中(1)“将给定页面转换为其逻辑地址”根据“Linux Kerenl 开发第 3 版”(2)“返回与页框相关的线性地址”根据“理解 linux 内核>>”(3)根据“了解linux虚拟内存管理器”“返回页面的物理地址”

那么哪一个是正确的呢?

让我们看(1):这个函数需要一个指向物理页面(页框)的指针,那个指针不是已经是“与该页框相关的逻辑地址”了吗?那指针值和返回值有什么区别呢?谢谢。

4

3 回答 3

10

1 和 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 回答