关于pgd,pud,pte的问题
时间:2011-08-20
来源:互联网
前段时间写了个程序,就要实现在用户空间分配内存,然后可以在内核通过把用户空间的虚拟地址转换为物理地址再转换为内核地址(即:用户空间地址-->物理地址-->内核地址),实现在内核读写用户空间的内存。主要调用了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");
/*
*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");
作者: lkdsgrjra 发布时间: 2011-08-20
嗯,比较高深的问题,mark
作者: cqbamboo 发布时间: 2011-08-20
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28