首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在内核模式下捕获数据总线错误异常

在内核模式下捕获数据总线错误异常
EN

Stack Overflow用户
提问于 2015-10-23 09:35:08
回答 2查看 1.1K关注 0票数 1

我在Virtex 5芯片的microblaze上运行Linux。实际上,我有两个芯片运行相同的Linux代码,但芯片中的HDL模块不同。我正在写一个驱动程序,我希望能够检测到它在哪个芯片上运行,并在此基础上做不同的事情。在驱动程序初始化期间,我试图从一个HDL模块读取ID寄存器,该模块存在于一个芯片上,而不在另一个芯片上,但在不存在ID寄存器的芯片上,我得到了一个“内核模式下的数据总线错误异常”。糟了。有没有办法捕获这个异常并继续加载我的驱动程序?

代码如下:

代码语言:javascript
复制
unsigned region;
unsigned long *res;
unsigned int val;

region = request_mem_region( 0x66000000, 100, NULL );
if ( region ) {
  res = ioremap( 0x66000000, 100 );
  if ( res ) {
    val = ioread32( res ); // exception happens here
    if ( val == REGID1 )
      printk( "we are on chip 1\n" );
    else
      printk( "we are on chip 2\n" );
    iounmap( res );
  }
  release_mem_region( 0x66000000, 100 );
}
EN

回答 2

Stack Overflow用户

发布于 2016-12-30 05:41:33

Linux引导过程非常不允许内存访问违规,特别是在内核代码中(例如,内核模式访问)。查看了Microblaze代码之后,您不能“捕获”这样的异常,因为它们立即是致命的(异常处理程序将调用die()函数)。

票数 0
EN

Stack Overflow用户

发布于 2019-07-17 23:53:41

在ARM64 SoC上遇到类似的问题时,我想在这里分享我找到的解决方案:

Linux内核(在4.14内核上检查)提供了一个名为probe_kernel_read (以及probe_kernel_write)的函数,该函数捕获对不存在的FPGA寄存器的访问(在这种情况下,我的FPGA显式中止传输),以及对非对齐地址的访问(在我的设计中没有处理)。

ioread32readl不同,probe_kernel_read似乎不是为IOMEM资源而设计的,但由于我的FPGA被映射为设备内存(请参阅ARM ARM),这对我来说应该不是问题。我还直接在AXI总线上检查了一些事务,没有发现任何问题。需要注意的是,这种行为可能取决于CPU架构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33293499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档