一、问题回顾
前面虽然根文件系统已经启动,但是明显是有问题的。
1. vi -> crash
使用 vi 命令时,直接 crash
[root@iTOP-4412]# vi[ 40.971723] 8<--- cut here ---
[ 40.973629] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[ 40.981737] pgd = (ptrval)
[ 40.984367] [00000000] *pgd=77069831
[ 40.987914] Internal error: Oops: 817 [#1] PREEMPT SMP ARM
[ 40.993354] Modules linked in:
[ 40.996380] CPU: 2 PID: 423 Comm: linuxrc Not tainted 5.8.5 #1
[ 41.002200] Hardware name: Samsung Exynos (Flattened Device Tree)
[ 41.008286] PC is at io_serial_out+0x18/0x20
[ 41.012532] LR is at arm_heavy_mb+0x1c/0x38
[ 41.016692] pc : [<c05bc26c>] lr : [<c011a774>] psr: 60000093
[ 41.022947] sp : eda83e90 ip : 1040dd39 fp : 00000020
[ 41.028152] r10: 00000001 r9 : ee347550 r8 : c0b33944
[ 41.033360] r7 : a0000013 r6 : c183429c r5 : 00000000 r4 : 00000002
[ 41.039874] r3 : 00000000 r2 : 00000730 r1 : 00000000 r0 : c183429c
[ 41.046385] Flags: nZCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment none
[ 41.053592] Control: 10c5387d Table: 6db2004a DAC: 00000051
[ 41.059316] Process linuxrc (pid: 423, stack limit = 0x(ptrval))
[ 41.065305] Stack: (0xeda83e90 to 0xeda84000)
[ 41.069642] 3e80: c183429c c05be7c0 00000001 ee347400
[ 41.077815] 3ea0: c183429c c05b78cc ee347400 00000000 ee34782e 000022a4 c0b33944 c059a614
[ 41.085974] 3ec0: eda4cb40 eda82000 ee347800 ee347550 c0b33944 ee347704 00000000 edab4240
[ 41.094133] 3ee0: c017c34c ee347728 ee347728 c1108ec8 0000002e ee347400 0000002e 000ed32a
[ 41.102292] 3f00: eda4cb40 0000002e 00000000 eda82000 ee347800 c05983cc 00000000 00000051
[ 41.110451] 3f20: c059a378 00000400 c0d9e6a8 edca6fc0 edab4240 eda4cb40 0000002e c059826c
[ 41.118610] 3f40: 000ed32a eda83f78 0000002e 00000004 00000000 c02c9384 00000000 ed9e8000
[ 41.126769] 3f60: eda4cb40 eda4cb40 00000000 00000000 000ed32a c02c95e0 00000000 00000000
[ 41.134929] 3f80: 00000000 c1108ec8 00005402 000f8e30 0000002e 000ed32a 00000004 c0100224
[ 41.143088] 3fa0: eda82000 c0100060 000f8e30 0000002e 00000001 000ed32a 0000002e 00000010
[ 41.151247] 3fc0: 000f8e30 0000002e 000ed32a 00000004 000003b9 00000000 000d6a6a 00000000
[ 41.159406] 3fe0: 00000001 be895c50 0000f66c b6e5e0cc 60000010 00000001 00000000 00000000
2. ls /dev 出现错位
ls /dev
之类的命令出现错位等。
二、问题分析
linux 的代码应该都是有经过测试才对啊!怎么可能这么容易 crash,这不可能不可能!!
busybox 的代码也是应该都经过了测试才对啊!怎么可能这么容易错位,这不可能不可能!!
事实证明,确实不太可能这么容易出现问题。。。
尝试直接烧写官方编译好的 dtb 文件,vi 就没有 crash,看来还是 dts 有些问题才导致了 kernel crash。
错位的问题,应该是 putty 有 bug?或是我 putty 的配置有问题?总之,换成了 HyperTerminal 就好了。。。
三、porting dts
经过一通胡乱移植,出现了一些问题。
1. ls 输出不全,vi crash
因为和应用层交互时有一些问题,所以感觉是内存或是 mmu 的问题,但是对比了好几次,都是一样的。。还没发现问题到底在哪。
因为最开始移植到能够启动 rootfs 时,ls 输出的时候就输出不全,而且会打印一条 dma Reset Channel
log 出来,找到 kernel 对应的代码,打印是 info 级别的 log,就把它注释了,其实问题应该就是出现在这里。
- 文件:
drivers\dma\pl330.c
line 1651
/* Returns 1 if state was updated, 0 otherwise */
static int pl330_update(struct pl330_dmac *pl330)
{
// ............................
val = readl(regs + FSC) & ((1 << pl330->pcfg.num_chan) - 1);
pl330->dmac_tbd.reset_chan |= val;
if (val) {
int i = 0;
while (i < pl330->pcfg.num_chan) {
if (val & (1 << i)) {
dev_info(pl330->ddma.dev, // line 1651
"Reset Channel-%d\t CS-%x FTC-%x\n",
i, readl(regs + CS(i)),
readl(regs + FTC(i)));
_stop(&pl330->channels[i]);
}
i++;
}
}
// ............................
}
最后发现果然是串口节点的 dmas
属性导致了问题,linux dts 还没支持好?Samsung’s DMA driver 还有问题?不管了,就注释掉这个使用吧。
这里解决掉后,就可以正常工作。并且把波特率设置到 460800 都可以,使用 vi 翻页也是没有延迟,太爽了!