在linux启动过程打印调试信息

 在linux内核启动入口打印调试信息

上网查到linux内核启动入口在head.S,例如我现在用的是arm,就是arch/arm/kernel/head.S。head.S里有一个过程stext。

我在stext开始加了一个bl printascii,想看这时候能不能打出log,按说这时候串口驱动神马的都是浮云。

模仿其它文件中的方法,定义一个字符串,先把字符串地址放到r0,然后调用printascii。启动时,字符串倒是打出来了,但是内核启动失败了,__lookup_processor_type报的错。我估计是把字符串地址放到r0传给printascii之类的操作,破坏了接下来调用__lookup_processor_type的参数。删除掉我加的printascii相关的代码就恢复正常。

我用的是ARM开发板。 


printascii在ARM上

printascii打印字符串,也是通过串口,操作串口的代码在哪里,是谁写的呢?看起来有点像所有的arm板都一样的代码。查了一下资料,这是ARM提供的debug功能,所以几行ARM汇编就实现了,而不是想像中的去操作核心板的串口。实际上是由核心板的uart0输出的,所以它们之间可能是连通的或怎样的。

注:
在ARM官方的一个网站上,有全部的文档,并提供文档内容的搜索,很方便。
http://infocenter.arm.com


i386

i386做对比,也是在head.S,有一个叫startup_32的过程,是入口。这没有printascii,类似的是printk和early_printk。

early_printk是单独实现的功能,从代码上看,直接操作底层的地址,有vga和serial两种console。

printk可能就是printk吧,在入口时的printk,应该等到控制台初始化成功才能看到吧,如果这之前出错,应该就看不到了。


串口驱动中的console代码

串口常做为控制台,所以串口驱动中,也有控制台的代码。相比printascii在上电就有效,串口驱动支持的控制台,是用宏console_initcall设置代码段地址到串口控制台初始化函数,start_kernel之后,在do_init中,调用了控制台的初始化,至此才有效。

注:console_initcall的定义,非标准的C语言,应该是利用了gnu gcc的特性,相当于汇编级别的操作。


结论
之前看到有说linux启动到控制台初始化完成这段时间,什么也看不到,调试很困难,看来所言不实。一般情况下,至少包括ARM和X86平台,上电之后就有打印信息的能力。

你可能感兴趣的:(linux)