最近碰到的问题

问题描述:

第2次dd写mtdblock出错,看System.map里0x8002d226是do_miss_aligned, 在这里加打印总没什么有效信息,callback无法看到是哪里的问题

MachineCheck Exception

[ECR]:0x00200000

FaultingInstn : 0x8002d226

Reason:(Other Fatal Err)


1. 在do_miss_aligned里加了打印,打印task name,callback都没看到什么实际有用信息,找不到导致miss align的地方


2.

把kernel debug_info选项编译进来和不编译似乎错误还有些差异

把kernel debug_info编译进来,看到第一条exception的eret和blink是__rmqueue范围,在这里接着打印,看到

mm/page_alloc.c

__rmqueue_smallest

 

list_del(&page->lru);

打印出来的page->lru这个list_head prev,next错

page->lru.prev = 0xffffffff,page->lru.next = 0xffffffff


我打印了page->lru地址是810a455c,nand线程 dma函数附近stack地址8a225e58, nand kzalloc地址 8a1a8000,

地址离的太远了,我看着又不像kzalloc的溢出或stack溢出。


3. 其实我首先想到的是堆栈溢出,周智说应该是驱动代码越界了,我又dd写card没这个问题。 Nand是read没问题,write有问题


4. 在nand函数从上往下屏蔽,函数直接return,看是哪里的问题,最后到nand dma read/write时执行dma操作的那句屏蔽就不会有问题。


6. 是ARC 系统,kernel logical address是0x70000000-0x80000000,这个已经和书上的不同了,PAGE_OFFSET是0x80000000,地址小于PAGE_OFFSET, 我看这个问题前,nand driver把系统传下来的地址0x8*******,或0x7*******直接作为dma传输地址,那么就是把logical / virtual address作为physical address来用,导致破坏了此物理地址对应的真实虚拟地址


7. 用kzalloc分配的地址作为dma地址不会报错,ARC乱的


8. 荣乐说dma_map_signle/ dma_alloc_coherent等dma函数ARC本身未实现,我们的不能正常使用,所以要用中转buffer作为dma传输地址。


你可能感兴趣的:(c,exception,list,buffer,callback)