------------[ cut here ]------------ ?

bigPillow 2015-07-28 09:33:48
背景:

我在给335x打xenomia补丁,xenomai对于linux的补丁文件仅有linux3.2.21.但是板子提供的是linux3.2.0,于是打个小补丁将linux3.2.0升级到linux3.2.21,升级后再打xenomia补丁。

一些就绪后,编译内核生成uImage,通过uboot下载到板子上面

在内核启动后,可以看到不断的打印出启动信息,但是当打印到:

[ 0.000000] NR_IRQS:396
[ 0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrupts
[ 0.000000] Total of 128 interrupts on 1 active controller
[ 0.000000] OMAP clockevent source: GPTIMER2 at 24000000 Hz
[ 0.000000] OMAP clocksource: GPTIMER1 at 24000000 Hz
[ 0.000000] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms
[ 0.000000] Interrupt pipeline (release #4)
[ 0.000000] ------------[ cut here ]------------

内核停止打印。

经测试, ------------[ cut here ]------------是由内核目录下的Panic.c (kernel)中的下面函数打印出来的:

static void warn_slowpath_common(const char *file, int line, void *caller,
unsigned taint, struct slowpath_args *args)
{
const char *board;

printk(KERN_WARNING "------------[ cut here ]------------\n");
printk(KERN_WARNING "WARNING: at %s:%d %pS()\n", file, line, caller);
board = dmi_get_system_info(DMI_PRODUCT_NAME);
if (board)
printk(KERN_WARNING "Hardware name: %s\n", board);

if (args)
vprintk(args->fmt, args->args);

print_modules();
dump_stack();
print_oops_end_marker();
add_taint(taint);
}

现在有个很奇怪的问题,通过上面的信息,看不出是哪里出错才打印出来。

于是我有添加了几个参考打印点:

static void warn_slowpath_common(const char *file, int line, void *caller,
unsigned taint, struct slowpath_args *args)
{
const char *board;

printk(KERN_WARNING "mark0\n");
printk(KERN_WARNING "------------[ cut here ]------------\n");
printk(KERN_WARNING "mark1\n");

printk(KERN_WARNING "WARNING: at %s:%d %pS()\n", file, line, caller);


board = dmi_get_system_info(DMI_PRODUCT_NAME);

此时有个奇怪的现象,内核在启动信息里只打印出了:

[ 0.000000] NR_IRQS:396
[ 0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrupts
[ 0.000000] Total of 128 interrupts on 1 active controller
[ 0.000000] OMAP clockevent source: GPTIMER2 at 24000000 Hz
[ 0.000000] OMAP clocksource: GPTIMER1 at 24000000 Hz
[ 0.000000] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms
[ 0.000000] Interrupt pipeline (release #4)
[ 0.000000] mark0

然后停止。不在打印出后面其他要打印出来的信息。

然后,我屏蔽点本函数的打印信息,如下:

static void warn_slowpath_common(const char *file, int line, void *caller,
unsigned taint, struct slowpath_args *args)
{
const char *board;
/*
printk(KERN_WARNING "mark0\n");
printk(KERN_WARNING "------------[ cut here ]------------\n");
printk(KERN_WARNING "mark1\n");
printk(KERN_WARNING "WARNING: at %s:%d %pS()\n", file, line, caller);
*/

board = dmi_get_system_info(DMI_PRODUCT_NAME)

则可以通过内核启动信息看到:

0.000000] NR_IRQS:396
[ 0.000000] IRQ: Found an INTC at 0xfa200000 (revision 5.0) with 128 interrupts
[ 0.000000] Total of 128 interrupts on 1 active controller
[ 0.000000] OMAP clockevent source: GPTIMER2 at 24000000 Hz
[ 0.000000] OMAP clocksource: GPTIMER1 at 24000000 Hz
[ 0.000000] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 178956ms
[ 0.000000] Interrupt pipeline (release #4)
[ 0.000000] 这里出现一句其他函数的 printk信息

然后内核启动停止。


请问这是什么原因。
...全文
1503 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigPillow 2015-07-30
  • 打赏
  • 举报
回复
引用 1 楼 nswcfd 的回复:
楼主“看到的”打印,要么是控制台的输出,要么是串口的输出吧? 估计要么printk内部有queue,或者console/serial内部有队列, 虽然printk函数把字符串传递进去,但在真正反映到屏幕或者串口上之前,Kernel进入了hang状态。 以上纯属猜测,没有任何依据。
现在是,内核在打印出 [ 0.000000] Interrupt pipeline (release #4) 后,不管后面是什么代码,只要遇见一个printk(无论printk前后是什么代码),Kernel就进入了hang状态.
nswcfd 2015-07-29
  • 打赏
  • 举报
回复
楼主“看到的”打印,要么是控制台的输出,要么是串口的输出吧? 估计要么printk内部有queue,或者console/serial内部有队列, 虽然printk函数把字符串传递进去,但在真正反映到屏幕或者串口上之前,Kernel进入了hang状态。 以上纯属猜测,没有任何依据。

4,465

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧