高端内存使用例子


//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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值