【发布时间】:2014-01-19 01:45:05
【问题描述】:
在内核模块 (2.6.32-358.el6.x86_64) 中,我想打印出所有物理地址,这些地址映射到进程的虚拟内存中。给定task->mm,我尝试遍历进程'struct page,如下:
int i, j, k, l;
for (i = 0; i < PTRS_PER_PGD; ++i)
{
pgd_t *pgd = mm->pgd + i;
if (pgd_none(*pgd) || pgd_bad(*pgd))
continue;
for (j = 0; j < PTRS_PER_PUD; ++j)
{
pud_t *pud = (pud_t *)pgd_page_vaddr(*pgd) + j;
if (pud_none(*pud) || pud_bad(*pud))
continue;
for (k = 0; k < PTRS_PER_PMD; ++k)
{
pmd_t *pmd = (pmd_t *)pud_page_vaddr(*pud) + k;
if (pmd_none(*pmd) || pmd_bad(*pmd))
continue;
for (l = 0; l < PTRS_PER_PTE; ++l)
{
pte_t *pte = (pte_t *)pmd_page_vaddr(*pmd) + l;
if (!pte || pte_none(*pte))
continue;
struct page *p = pte_page(*pte);
unsigned long phys = page_to_phys(p);
printk(KERN_NOTICE "addr %lx", phys);
}
}
}
}
输出看起来有点奇怪(特别是有一系列相同的地址),所以我想问一下,理论上是否正确。
【问题讨论】:
-
这一系列相同的地址可能是零页的写时复制映射。
标签: memory-management linux-kernel virtual-memory