免费注册 查看新帖 |

Chinaunix

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

Bus error问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-17 14:42 |只看该作者 |倒序浏览
用人家厂商提供的驱动程序和测试例子,测试pci的NT驱动,运行用户态程序的时候提示Bus error,现在不能确定是不是硬件问题。

情况是这样的:

(1)驱动程序使用dma_alloc_coherent()分配了一段内存,执行完打印如下:
Allocated physical memory...
     CPU Phys Addr: 0xbfccb000
     Bus Phys Addr: 0x3fe05000
     Kernel VA    : 0xffccb000
     Size         : 1000 bytes

(2)用mmap()函数将该内存映射到用户空间,运行完打印如下:
PhysBuffer.UserAddr = 0x15578000

(3)对PhysBuffer.UserAddr的任何读写操作都会导致Bus error的错误提示,然后内核就崩溃了

我查了一些关于Bus error的错误提示问题,说是对未对齐在边界的内存地址进行操作引起的,可是从我的系统申请到的内存和用户态的内存来看,肯定是能够对齐在边界上的啊,我用的arm9平台

这个问题有没有可能是硬件引起的?或者有没有什么调试的思路啊?我都快崩溃了

论坛徽章:
0
2 [报告]
发表于 2010-05-17 16:03 |只看该作者
总线错误 不是说你申请的是边界对齐就没问题,而是说的的测试程序或者应用程序中对内存有非对齐的访问吧。
arm和x86不一样 x86可以进行非对齐访问 而arm不可以   @newbie@

论坛徽章:
0
3 [报告]
发表于 2010-05-17 18:57 |只看该作者
回复 2# 1226ehziy


    ls的兄弟,您好

忘了说我的用户态程序了,我仅仅是对申请到的地址的首地址进行了读写操作,还没有加偏移呢,想不通怎么会对未对奇的内存操作。

仅仅是 printf("PhysBuffer.UserAddr= 0x%08x\n", *(PhysBuffer.UserAddr));

论坛徽章:
0
4 [报告]
发表于 2010-05-18 15:23 |只看该作者
把你mmap的代码贴出来.

论坛徽章:
0
5 [报告]
发表于 2010-05-19 09:48 |只看该作者
真的没有大侠来指点下思路么?

论坛徽章:
0
6 [报告]
发表于 2010-05-19 11:01 |只看该作者
补充:

Unhandled fault: imprecise external abort (0x416) at 0x1569d000
Bus error

错误提示是这个,不知道小括号里面的416是不是导致Bus error的主因呢?哪位大侠解释下“Unhandled fault。。。”这句话啊

论坛徽章:
0
7 [报告]
发表于 2010-05-19 13:17 |只看该作者
跟你说了把mmap的那句贴出来.你不贴怎么帮你看?!

论坛徽章:
0
8 [报告]
发表于 2010-05-19 16:58 |只看该作者
回复 6# 527639827


   说一下我分析的过程吧,虽然我还没法找到这个问题的所在。
   我这里的内核是linux-2.6.32.8
   grep "imprecise external abort"  ./ -r -n
   打出来的信息是:
   ./arch/arm/mm/fault.c:482:        { do_bad,                SIGBUS,  BUS_OBJERR,        "imprecise external abort"           }, /* xscale */
./arch/arm/mach-iop13xx/pci.c:990:                        "imprecise external abort";
./arch/arm/mach-ixp4xx/common-pci.c:385:        hook_fault_code(16+6, abort_handler, SIGBUS, "imprecise external abort";
./arch/arm/plat-iop/pci.c:362:        hook_fault_code(16+6, iop3xx_pci_abort, SIGBUS, "imprecise external abort";
通过上面的这几条信息 可以定位到应该是那个fault.c
再这个文件中 找到了这样一个函数

  1. /*
  2. * Dispatch a data abort to the relevant handler.
  3. */
  4. asmlinkage void __exception
  5. do_DataAbort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
  6. {
  7.         const struct fsr_info *inf = fsr_info + fsr_fs(fsr);
  8.         struct siginfo info;

  9.         if (!inf->fn(addr, fsr & ~FSR_LNX_PF, regs))
  10.                 return;

  11.         printk(KERN_ALERT "Unhandled fault: %s (0x%03x) at 0x%08lx\n",
  12.                 inf->name, fsr, addr);//很明显那个出错的log信息是这里大出来的
  13.         info.si_signo = inf->sig;
  14.         info.si_errno = 0;
  15.         info.si_code  = inf->code;
  16.         info.si_addr  = (void __user *)addr;
  17.         arm_notify_die("", regs, &info, fsr, 0);//到这里意味着程序挂了
  18. }
复制代码
这个好像不是因为不对齐访问引起的  因为不对齐访问的错误码应该是BUS_ADRALN
因为错误码是BUS_OBJERR  定义在asm-generic\siginfo.h中
在内核中的解释是 object specific hardware error

在wiki上有这样一句话
Object-specific hardware error
    This is far less common, but it is present in Solaris, when virtual memory pages have disappeared (e.g. accessing an mmaped file which has been truncated.)

希望这点分析对lz有帮助 期待lz解决问题后反馈一下 。@@。

论坛徽章:
0
9 [报告]
发表于 2010-05-19 18:51 |只看该作者
回复 8# 1226ehziy

感谢大哥的解释,真是详尽啊。

我想可能是内核态申请内存空间的时候,虽然成功了返回了地址,但是这个地址可能我使用的不恰当,导致的。

我再研究研究,有情况一定上来通报下。。。

论坛徽章:
0
10 [报告]
发表于 2010-05-19 20:03 |只看该作者
回复 7# samlumengjun

驱动程序中内核态分配内存资源的函数:
pMemObject->pKernelVa =
        Plx_dma_alloc_coherent(
            pdx,
            pMemObject->Size,
            &BusAddress,
            GFP_KERNEL | __GFP_NOWARN
            );

内核态将cpu虚拟地址转换为物理地址
pMemObject->CpuPhysical =
        virt_to_phys(
            pMemObject->pKernelVa
            );


用户态的映射函数:
    pMemObject->UserAddr =
           (PLX_UINT_PTR)mmap(
             0,
            pMemoryInfo->Size,
            PROT_READ | PROT_WRITE,
            MAP_SHARED,
            pDevice->hDevice,
            pMemObject->CpuPhysical     // CPU Physical address of buffer
            );


请教大虾能看出来哪里的问题不?对pMemObject->UserAddr 的读写操作都会导致Bus error
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP