初识 Linux Kernel 移植 之 内核启动调试

在linux kernel 移植时,从u-boot跳转到kernel启动阶段后,串口控制台只打印了内核解压完成的信息:

 Uncompressing Linux... done, booting the kernel.

这段消息的意思是内核解压完成,接下就进入到内核启动阶段,也就是进入到‘ arch\arm\kernel\head.Shead.S :ENTRY(stext)’,进入到内核启动汇编语言阶段。那么应该怎么去调试呢?在u-boot汇编语言启动阶段使用的调试方式有:控制LED、串口打印字符,那么在内核启动的汇编阶段是否可以使用这两种方式来调试呢?(备注:可通过在start_kernel函数的起始位置添加 printascii(“xxx”) 来判断错误是在start_kernel 之前(汇编语言)还是之后(内核的初始化C语言) )。
####1、printascii调试
在控制台未可用时,printk函数是无法输出打印信息的,而printascii 直接通过串口寄存器实现了输出ascii码,但是要实现printascii函数,必须在内核中添加该配置:

Kernel hacking  ---> 
	   Kernel low-level debugging functions: 选中
	   (N) S3C UART to use for low-level debug: (备注:N,表示的是使用哪个串口)

在汇编语言中添加printascii调试:

	mov r7,lr
	adr	r0, str_p1
	bl	printascii
	mov lr, r7
	mov pc, lr
str_p1:	.asciz	"\ndebug: test.... \n"
	.align

####2、控制LED和串口打印字符调试
同u-boot中一样,在kernel中也可以通过LED和串口打印字符来调试,这是为什么呢?原因是在kernel敢开始的阶段,使用的是u-boot提供的初始化过的硬件环境,因此可以直接使用,但同时需要主要的是,在调用启动mmu后,这种调试方式将变的很麻烦。
汇编中串口打印字符的调试:

	/* Print 'K' */
	ldr	r0, =0x13820000 @串口的基地址
	ldr	r1, =0x4b4b4b4b @字符的ascii码
	str	r1, [r0, #20]

printascii调试 和 串口打印字符调试都是可以打印ascii码,但是printascii可以打印多个即一段信息,而这里串口只能打印单个ascii码,再加上如果启用了mmu,printascii做了虚拟地址适配,而串口打印字符没有,因此printascii更方便调试。

你可能感兴趣的:(嵌入linux)