读书人

GNU ARM汇编-(十五)linux上的printasc

发布时间: 2012-10-13 11:38:17 作者: rapoo

GNU ARM汇编--(十五)linux下的printascii

在前面对很多s3c2440的功能模块进行学习后,已经具备了将这些模块综合起来的条件,基于此,将前面的代码综合成一个简单的bootloader.自己写的bootloader在引导kernel的时候,串口输出只有Uncompressing Linux...和done, booting the kernel。串口有这个输出,说明kernel被正确引导了,但是串口有问题。

这篇blog只是分析解决这个问题的第一步:

既然"Uncompressing Linux..."这句打印是kernel代码中的,那kernel的其他打印怎么没有?

在arch\arm\boot\compressed目录下的misc.c中,上面的打印是在decompress_kernel函数中,而该函数是在kernel的初始汇编中调用的,也就是说这个时候kernel的串口驱动肯定是没有工作的,那这里的串口输出只能是用bootloader初始化好的串口,

putstr("Uncompressing Linux...");

putstr(" done, booting the kernel.\n");

.macro addruart, rxmrcp15, 0, \rx, c1, c0tst\rx, #1ldreq\rx, = S3C24XX_PA_UARTldrne\rx, = S3C24XX_VA_UART#if CONFIG_DEBUG_S3C_UART != 0add\rx, \rx, #(S3C2410_UART1_OFF * CONFIG_DEBUG_S3C_UART)#endif.endm
从p15协处理器来查看MMU是否打开了,从而用PA或者VA,这说明MMU打开前或者后都可以用printascii进行debug。

在include\asm-arm\plat-s3c\debug-macro.S中,有senduart、busyuart和waituart的定义,具体代码就不贴出来了,这三个代码实现了串口的输出,这三个宏定义针对fifo和非fifo的情况都做了处理,保证代码的健壮。

到这里,可以看出来printascii基于bootloader或者kernel对串口的初始化后才能起作用,但一般用printascii辅助debug主要用于kernel的最开始部分,这时候的串口初始化用的还是bootloader的。当然,在kernel的串口驱动正常工作后,printascii同样是起作用的。最后,printascii代码还是很健壮的,而且printascii的生命周期也是相当长的,从kernel启动开始到kernle关闭之时,printascii都是能向串口输出信息的。

在用printascii函数debug和分析printascii是如何实现之后,对于开头的问题,进一步缩小了分析目标,后面的分析将围绕bootloader与kernel之间的参数传递问题,以及linux的串口驱动。














读书人网 >UNIXLINUX

热点推荐