问题描述:
第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传输地址。