- 论坛徽章:
- 0
|
void *page_address(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;
}
大虾们,请问函数中既然已经用HASH表找到了page_address_map ,那么此时其对应的PAGE FRAME也就找到了,继而virtual ADDRESS也就有了!既然如此,为何还要list_for_each_entry这样遍历双链表LIST,这不是没必要了吗?
呵呵,可能还没搞清楚一些东西,不过还是希望DX们解释一下,谢谢! |
|