//PHYS_MASK = 0xffffffff
//ARCH_PFN_OFFSET = 0x40000
struct page *walk_page_table(unsigned long addr)
{
//addr传入的是 用户态地址 即 c0000000以下的地址
pgd_t *pgd;
pte_t *ptep, pte;
pud_t *pud;
pmd_t *pmd;
int debug_en;
struct page *page = NULL;
struct mm_struct *mm = current->mm;
struct task_struct *task;
task = current;
if( task->comm[0]=='c' && task->comm[1]=='a' && task->comm[2]=='t' ){
debug_en = 0x01;
}else{
debug_en = 0x01;
}
if( debug_en ){
printk("\n\n\n addr = 0x%lx\n", addr);
printk("mm->pgd = 0x%lx\n", mm->pgd);
printk("task->pid = %d\n", task->pid);
printk("task->comm = %s\n", task->comm);
}
pgd = pgd_offset(mm, addr);
if( debug_en ){
printk("pgd = 0x%lx\n", pgd);
}
pmd = (pmd_t *)pgd;
if( pmd_none(*pmd) || pmd_bad(*pmd) ){
goto out;
}
if( debug_en ){
printk("pmd = 0x%lx\n", pmd);
printk("*pmd = 0x%lx\n", *pmd);
}
printk("pmd_val(*(pmd)) = 0x%lx\n", pmd_val(*(pmd)) );
printk("mem_map = 0x%lx\n", mem_map );
printk("pte_index(addr) = 0x%lx\n", pte_index(addr) );
printk("pmd_page(*(pmd)) = 0x%lx\n", pmd_page(*(pmd)) );
//到此处为止 与内核态寻址是一样的
ptep = pte_offset_map(pmd, addr);
//高端内存映射
if (!ptep){
goto out;
}
pte = *ptep;
if( debug_en ){
printk("ptep = 0x%lx\n", ptep);
printk("pte = 0x%lx\n", pte);
}
page = pte_page(pte);
if (page){
if( debug_en ){
printk(KERN_INFO "page frame struct is @ %p\n", page);
void *kaddr = kmap(page);
kaddr = (unsigned int)kaddr | (addr & 0xfff);
printk("kaddr = 0x%lx\n", kaddr);
print_hex_dump_bytes("wsm_buf.data1x1: ", DUMP_PREFIX_ADDRESS, (u8 *)(kaddr), 0x40 );
kunmap(page);
}
}
//kmap kmap_atomic
pte_unmap(ptep);
out:
return page;
}
运行方法与结果:
echo 12345678 > /sys/kernel/debug/pttest
echo 12345678 > /sys/kernel/debug/pttest <
[ 93.878380]
[ 93.878380]
[ 93.878380]
[ 93.878380] addr = 0xb4ba81e4
[ 93.887179] mm->pgd = 0xd96bc000
[ 93.890944] task->pid = 3334
[ 93.894264] task->comm = sh
[ 93.898422] pgd = 0xd96bed28
[ 93.901803] pmd = 0xd96bed28
[ 93.905511] *pmd = 0x8fc41835
[ 93.909272] pmd_val(*(pmd)) = 0x8fc41835
[ 93.914222] mem_map = 0xea5f8000
[ 93.917966] pte_index(addr) = 0x1a8
[ 93.922129] pmd_page(*(pmd)) = 0xeb12f924
[ 93.926630] ptep = 0xffefe6a0
[ 93.929950] pte = 0x8fadd75f
[ 93.933173] page frame struct is @ eb12c714
[ 93.937863] kmap.1
[ 93.940112] kaddr = 0xbfecf1e4
[ 93.943550] wsm_buf.data1x1: bfecf1e4: 31 32 33 34 35 36 37 38 0a 65 6c 2f 64 65 62 75 12345678.el/debu
[ 93.954141] wsm_buf.data1x1: bfecf1f4: 67 2f 70 74 74 65 73 74 00 7b 20 5c 5c 62 75 69 g/pttest.{ \\bui
[ 93.964735] wsm_buf.data1x1: bfecf204: 6c 74 69 6e 20 6c 65 74 20 22 20 65 20 22 20 3b ltin let " e " ;
[ 93.975329] wsm_buf.data1x1: bfecf214: 20 7d 20 26 26 20 52 45 50 4c 59 2b 3d 22 24 65 } && REPLY+="$e
[ 93.986280] count = 0x9
[ 93.989035] pos = 0xd9517f70
[ 93.992264] *pos2 = 0x0
[ 93.995006] testcase = 0x12345678