kernel debug:
I think you also need to pass the boot arg "early_printk" as well to see the early debug output.
You might also try passing "initcall_debug". Or it could be "debug_initcall". One of those should provide more detailed information about what initcall is crashing (if the kernel init gets that far).
cat System.map | grep __log_buf
c046684c b __log_buf
这里我们看到log_buf的内存地址在c0535fdc,这是个虚拟地址,根据kernel地址映射规律,从MEM_PHY_START到MEM_PHY_END,都会一一映射到0xc0000000: (0xc0000000 + MEM_PHY_SIZE),因此假设我们内存的物理地址起始是0x0,那么这里log_buf的实际物理地址为0x00535fdc。
c046684c => 8046684c
md 8046684c 800
804670bc - 8046684c = 870
870 /4 ~= 220
VTH # md 8046684c 220
8046684c: 4c3e353c 78756e69 72657620 6e6f6973 <5>Linux version
8046685c: 362e3220 2e32332e 642d3731 6e697661 2.6.32.17-davin
8046686c: 20316963 40697428 676e617a 20297465 ci1 (ti@zanget)
//...
1>Unable to
80466ffc: 6e616820 20656c64 6e72656b 70206c65 handle kernel p
8046700c: 6e696761 65722067 73657571 74612074 aging request at
8046701c: 72697620 6c617574 64646120 73736572 virtual address
8046702c: 63313020 30653137 313c0a30 6467703e 01c71e00.<1>pgd
8046703c: 63203d20 34303030 0a303030 5b3e313c = c0004000.<1>[
8046704c: 37633130 30306531 702a205d 303d6467 01c71e00] *pgd=0
8046705c: 30303030 0a303030 493e303c 7265746e 0000000.<0>Inter
8046706c: 206c616e 6f727265 4f203a72 3a73706f nal error: Oops:
8046707c: 5b203520 205d3123 45455250 0a54504d 5 [#1] PREEMPT.
8046708c: 6c3e303c 20747361 66737973 69662073 <0>last sysfs fi
8046709c: 203a656c 3e343c0a 75646f4d 2073656c le: .<4>Modules
804670ac: 6b6e696c 69206465 3c0a3a6e 50433e34 linked in:.<4>CP
804670bc: 30203a55 20202020 20746f4e 6e696174 U: 0 Not tain
VTH #
本文探讨了在内核调试中遇到的问题,包括如何通过传递bootarg 'early_printk' 和 'initcall_debug' 或 'debug_initcall' 来获取早期调试输出,并通过解析System.map文件来定位关键错误信息,例如log_buf的实际物理地址和内核版本信息。此外,文章还详细解释了在错误堆栈中出现的特定错误消息和代码段含义。
6302

被折叠的 条评论
为什么被折叠?



