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

本文介绍了在Linux内核启动阶段的调试方法,包括printascii和串口打印字符两种方式。详细解释了如何配置内核支持printascii调试,并对比了两种调试方式的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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更方便调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值