- 论坛徽章:
- 0
|
我将一个写好的,并在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平台的新手,是不是还有遗漏的东西,导致问题的产生。请各位大侠指点。。
谢谢!!! |
|