printk("\n=======Data========\n");
unsigned long vpp = ioremap_nocache(paddr, 18);
int i = 0;
for (i = 0; i < 18; i++) {
printk("%c", *(volatile unsigned char *)(vpp + i));
}
printk("\n=======Data=======\n");
return 0;
default:
return -EINVAL;
}
}
/* 使用进程的虚拟地址查找物理地址 */
static unsigned long uva_to_pa(struct mm_struct *mm, unsigned long addr)
{
unsigned long ret = 0UL;
pgd_t *pgd;
pud_t *pud;
pmd_t *pmd;
pte_t *pte;
pgd = pgd_offset(mm, addr);
if (!pgd_none(*pgd)) {
pud = pud_offset(pgd, addr);
if (!pud_none(*pud)) {
pmd = pmd_offset(pud, addr);
if (!pmd_none(*pmd)) {
pte = pte_offset_map(pmd, addr);
if (!pte_none(*pte) && pte_present(*pte)) {
/* Use hard PTE */
pte = (pte_t *)((u32)pte - 2048);
if(pte)
ret = (*pte & 0xfffff000) | (addr & 0xfff);
} else {
printk("pet is not present:0x%08x\n", (*pte & 0xfffff000) | (addr & 0xfff));
}
}
}
}
return ret;
}作者: asuka2001 时间: 2011-08-12 11:26
你可以参见Linker script in Linux中第14页3.3.1.1 Exception Table有一些相关描述作者: huyugv_830913 时间: 2011-08-12 12:59
阅读了以下Linker script in Linux中第14页3.3.1.1 Exception Table有一些相关描述
这讲的假设地址不再用户进程地址空间VMA时,kernel如何检查地址无效时,怎么能够正确处理的流程。