我在Virtex 5芯片的microblaze上运行Linux。实际上,我有两个芯片运行相同的Linux代码,但芯片中的HDL模块不同。我正在写一个驱动程序,我希望能够检测到它在哪个芯片上运行,并在此基础上做不同的事情。在驱动程序初始化期间,我试图从一个HDL模块读取ID寄存器,该模块存在于一个芯片上,而不在另一个芯片上,但在不存在ID寄存器的芯片上,我得到了一个“内核模式下的数据总线错误异常”。糟了。有没有办法捕获这个异常并继续加载我的驱动程序?
代码如下:
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 );
}发布于 2016-12-30 05:41:33
Linux引导过程非常不允许内存访问违规,特别是在内核代码中(例如,内核模式访问)。查看了Microblaze代码之后,您不能“捕获”这样的异常,因为它们立即是致命的(异常处理程序将调用die()函数)。
发布于 2019-07-17 23:53:41
在ARM64 SoC上遇到类似的问题时,我想在这里分享我找到的解决方案:
Linux内核(在4.14内核上检查)提供了一个名为probe_kernel_read (以及probe_kernel_write)的函数,该函数捕获对不存在的FPGA寄存器的访问(在这种情况下,我的FPGA显式中止传输),以及对非对齐地址的访问(在我的设计中没有处理)。
与ioread32或readl不同,probe_kernel_read似乎不是为IOMEM资源而设计的,但由于我的FPGA被映射为设备内存(请参阅ARM ARM),这对我来说应该不是问题。我还直接在AXI总线上检查了一些事务,没有发现任何问题。需要注意的是,这种行为可能取决于CPU架构。
https://stackoverflow.com/questions/33293499
复制相似问题