2012-07-22 246 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; 
}