1. 程式人生 > >初識 Linux Kernel 移植 之 核心啟動除錯

初識 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更方便除錯。