免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3133 | 回复: 3
打印 上一主题 下一主题

问一个关于pgd,pud,pte的问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-18 23:27 |只看该作者 |倒序浏览
前段时间写了个程序,就要实现在用户空间分配内存,然后可以在内核通过把用户空间的虚拟地址转换为物理地址再转换为内核地址(即:用户空间地址-->物理地址-->内核地址),实现在内核读写用户空间的内存。主要调用了pgd,pud,pte相关函数。下面是片段代码,在虚拟机上试验成功,但是放到服务器上就出现oops,应该是在pte_none(*pte)这句崩溃。是不是因为服务器的内存大于4G?我刚开始研究内核不久,请大家帮忙解答一下,谢谢。
/*
        *convert vaddr to kernel logic addr
        *1,get the current task by pid
        *2,get the phyaddr
        *3,convert phyaddr to kernel logic addr
        *4,write sth. in the buffer

        *NOTE:step 1 is not necessay,because now current is pointed to task
        */

        __DEBUG_MSG("The pid which user passed in is:%d\n"
                                " The current pid is:%d\n", pid, current->pid);
        /*get phyaddr*/
        pgd = pgd_offset(current->mm, vaddr);
        if ( pgd_none(*pgd) || pgd_bad(*pgd) )
        {
                __DEBUG_MSG("invalid pgd\n");
                retval = -1;
                goto error;
        }

        pud = pud_offset(pgd, vaddr);
        if ( pud_none(*pud) || pud_bad(*pud) )
        {
                __DEBUG_MSG("invalid pud\n");
                retval = -1;
                goto error;
        }

        pmd = pmd_offset(pud, vaddr);
        if ( pmd_none(*pmd) || pmd_bad(*pmd) )
        {
                __DEBUG_MSG("invalid pmd\n");
                retval = -1;
                goto error;
        }
        __DEBUG_MSG("before pte_offset_map\n");
        pte = pte_offset_map(pmd, vaddr);
        __DEBUG_MSG("after pte_offset_map\n");
        pte_unmap(pte);
        if ( pte_none(*pte) )
        {
                __DEBUG_MSG("bad pte va: %X pte: %p pteval: %lX\n", vaddr, pte, pte_val(*pte));
                retval = -1;
                goto error;
        }

        phy = (pte_val(*pte)) & PAGE_MASK;

        __DEBUG_MSG("the phy addr is %lu\n", phy);

        mypage = pte_page(*pte);
        set_bit(PG_locked, &mypage->flags);
        atomic_inc(&mypage->_count);

        /*convert phy to kernel logic addr*/
        laddr = __pa(phy);
        strcpy((char *)laddr, "hello kmap");

论坛徽章:
0
2 [报告]
发表于 2011-08-19 10:12 |只看该作者
怎么还没人回答。。。

论坛徽章:
0
3 [报告]
发表于 2011-08-19 13:50 |只看该作者
回复 1# lkdsgrjra


    你确定用户空间使用的物理页都没有被换出?

论坛徽章:
0
4 [报告]
发表于 2011-08-19 14:08 |只看该作者
回复 3# zhanglistar


    pte_none(*pte),执行到这就崩了。每次都是到这。还没执行下面的忘内存中拷贝语句呢。应该怎么处理?我也弄不清是哪出问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP