免费注册 查看新帖 |

Chinaunix

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

诡异的问题,为什么向mmap好的内存中写入数据会引发异常? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-08-08 16:45 |只看该作者 |倒序浏览
我将一个写好的,并在x86下调试过的驱动移植到ppc平台上时,出现了一个非常奇怪的现象。
在向mmap好的物理内存中写入数据时会引发ppc的MachineCheckExecption异常。,通过oops消息得知错误号为7,是总线错误.

我们都知道将一段物理mmap到用户空间其实是非常简单的,代码如下:
static int xxx_mmap(struct file *inode, struct vm_area_struct *vma)
{
int result = 0;
int pg_off = 0;
unsigned long phy_addr = 0;
struct xxx_private *priv = NULL;
priv = &xxx_priv;

/*map sdram*/
phy_addr = priv->sdram.low_phy;
pg_off = phy_addr >> PAGE_SHIFT;
result = remap_pfn_range(vma, vma->vm_start, pg_off,
vma->vm_end - vma->vm_start,
vma->vm_page_prot);
if (result)
{
return -EAGAIN;
}

return 0;
}

mmap的代码非常短,实在不应该出错。我本来是怀疑ppc上计算页帧号的方法和x86上有所不同,但通过阅读ppc平台下的io_remap_page_range宏的定义,发现ppc上的页帧号也是同样的计算方法。
#define io_remap_page_range(vma, vaddr, paddr, size, prot) \
remap_pfn_range(vma, vaddr, (paddr) >> PAGE_SHIFT, size, prot)

所以实在不知道问题出在哪里。
后来通过进一步的测试,在内核态对板卡的物理内存进行读写,发现读写正常。所以可以确定的是板卡本身没有问题,问题就出现在mmap上。

小弟是ppc平台的新手,是不是还有遗漏的东西,导致问题的产生。请各位大侠指点。。

谢谢!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP