在Google上搜索“msleep hang linux kernel site:stackoverflow.com”可以得到13个答案,但没有一个是关键点,所以我认为我可以放心地提问。
我重新构建了一个ARM Linux内核,用于嵌入式TI AM1808 ARM处理器(Sitara / DaVinci?)。我看到所有启动日志都从串口输出,但尝试登录没有响应,甚至没有回显我输入的内容。
经过大量调试,我到达了内核,并在第828行和第830行之间添加了调试代码(是的,内核版本是2.6.37)。这是在'sbin/init'被调用之前的内核模式中的一个点:
http://lxr.linux.no/linux+v2.6.37/init/main.c#L815
在第830行之前,我添加了一个无限循环的printk,并且我看到了结果。我让它运行了几个小时,它计数到了大约200万。示例行:
dbg:init/main.c:1202: 2088430
因此,它已经成功地输出了 6000 万个字节。
然而,如果在循环中添加 msleep(1000),它只会打印一次,即 msleep() 不返回。
详细信息: 在调度程序的第 4073 行添加一个有条件的 printk,该条件取决于上述永久测试循环开始时设置的标志,显示当其挂起时不再调用 schedule():
http://lxr.linux.no/linux+v2.6.37/kernel/sched.c#L4064
.config/'Device Drivers'下唯一可选项为: 块设备 I2C支持 SPI支持内核及其ramdisk使用uboot/TFTP加载。 我不认为它会尝试使用以太网。 由于所有这些都发生在'/ sbin / init'之前,因此应该很少发生。
更多细节: 我有一个非常相似的板子,使用相同的CPU。 我可以运行相同的uImage和相同的ramdisk,在那里它工作正常。 我可以登录并做通常的事情。
我运行了内存测试(总共64 MB,将内核限制为32M并测试另外32M;它是单芯片DDR2),并没有发现问题。 一个板子使用UART0,另一个使用UART2,但启动日志从两个板子上都输出,所以这不应该是问题。
非常感谢任何调试提示。 我没有适当的JTAG,所以无法使用它。