初識 Linux Kernel 移植 之 核心啟動除錯
阿新 • • 發佈:2019-02-16
在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”)
####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更方便除錯。