pte_alloc函数疑惑!!!

extern inline pte_t * pte_alloc(pmd_t * pmd, unsigned long address)
{
address = (address >> PAGE_SHIFT) & (PTRS_PER_PTE - 1);//将给的线性地址转换成其所属页面表的下标---即高位的第二个10位,此时,PGD_SHIFT为12.

if (pmd_none(*pmd))//没有该表项
goto getnew;
if (pmd_bad(*pmd))//例行检查,发现是错误的,也就是和页面信息不合适。感觉多余!
goto fix;
return (pte_t *)pmd_page(*pmd) + address;//返回的该地址所属页表中的表项,下一步就是物理地址了。
getnew://分配一个表项。一个页表所占的空间,恰好时一个物理页面。 当释放一个页表的时候,内核将释放的页表先保存在一个缓存池中,而不先将其物理内存释放掉,只有在缓冲池中已经满的情况下,释放。这就是get_pte_fast().如果缓冲池中空的,就要用get_pte_slow()来分配了。
{
unsigned long page = (unsigned long) get_pte_fast();

if (!page)
return get_pte_slow(pmd, address);
set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(page)));//将一些属性标志位和起始地址一起写入页面目录项pgd中。这样,映射的“基础设施”已经弄好。但页面表项pte还是空的,剩下的就是物理内存本身了。那是由handle_pte_fault()完成的。
return (pte_t *)page + address;
}
fix:
__handle_bad_pmd(pmd);
return NULL;
}
问题如下:
上面的红色字体部分,第一个返回的是虚拟的地址,该地址指向pte,
第二个返回的是什么地址?请问?

同时,为什么,set_pmd宏,中的第二个参数要用物理地址?不是说,操作的都是虚拟地址吗???

作者: yskcg   发布时间: 2011-01-14

顶起来!!!!

作者: yskcg   发布时间: 2011-01-14