2012-07-22 249 views
1

我很困惑与功能:linux内核函数page_address()

无效* page_address(结构页*页)

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

哪一个是c orrect呢?

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

回答

5

1和2都是正确的 - 它们是说同一事物的两种方式(虽然解释2更清楚)。解释3不正确 - page_address()返回页面帧的虚拟地址,而不是物理地址。

page_address()确实不是带一个指向页面/页面框架的指针。它需要一个指向struct page的指针,这是一个表示页面的内核数据对象。

0

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; 
}