一种调试Linux内核的方法技术

技术编号:38097762 阅读:7 留言:0更新日期:2023-07-06 09:13
本发明专利技术提供一种调试Linux内核的方法,包括以下步骤:步骤S1、通过串口的控制寄存器初始化串口;步骤S2、保存通用寄存器X0

【技术实现步骤摘要】
一种调试Linux内核的方法


[0001]本专利技术涉及一种内核调试
,尤其涉及一种调试Linux内核的方法。

技术介绍

[0002]操作系统厂商有自身产品规划,尤其是Linux内核,不会轻易为了某一款芯片或某一个硬件平台更换他们的Linux内核。但是在嵌入式领域中,芯片厂商提供的内核版本并不一定与操作系统厂商的内核版本相同或相近,在操作系统厂商移植芯片厂商提供的内核时经常遇到内核无输出的情况,而操作系统厂商使用的硬件设备可能没有JTAG接口,这使得操作系统厂商在移植内核时造成比较大的困难。
[0003]常调试内核的手段有四种:第一种,通过printk函数使用串口输出日志进行调试。这种方法在内核已经适配的情况下可以使用,但是在内核移植阶段的初期,芯片可能初始化没有成功,串口并未启动,所以无法使用printk函数进行日志调试追踪。
[0004]第二种,通过gdb进行在线调试。这种方法至少需要串口能够运行,内核移植初期也无法适用。
[0005]第三种,通过JTAG设备进行调试。这种方式需要使用引出了JTAG引脚的设备进行调试,这种设备操作系统厂商不一定能拿到,不具备通用性。
[0006]第四种,通过点亮板载LED灯的方式调试。这种方式对于不同设备LED等的链接地址不尽相同,需要针对每一个设备进行编写代码。而且这种方式不能输出数据,只能判断执行结果是否满足预期,调试的可操作性和灵活性较差。
[0007]因此,如何在Linux内核代码汇编函数入口前,实现Linux内核启动前期的调试功能是本领域技术人员亟需解决的技术问题。

技术实现思路

[0008]针对上述问题,本专利技术提供一种调试Linux内核的方法;通过在Linux内核代码汇编函数入口前,使用汇编语言对串口进行初始化,再打印所有的通用寄存器及sp、lr、pc、spsr、elr寄存器,从而实现linux内核启动前期的调试功能。
[0009]为实现上述目的,本专利技术公开了一种调试Linux内核的方法,包括以下步骤:步骤S1、通过串口的控制寄存器初始化串口;步骤S2、保存通用寄存器X0

X29的值至堆栈sp中;步骤S3、顺次打印通用寄存器;步骤S4、将系统寄存器的值读取至通用寄存器中,重复步骤S3;步骤S5、从堆栈sp中恢复通用寄存器X0

X29;步骤S6、编译修改后的内核并部署。
[0010]进一步的,所述步骤S1具体包括:步骤S11、基于线性控制寄存器设置串口为8n1模式;
步骤S12、基于中断使能控制器设置串口为非中断模式;步骤S13、基于FIFO控制寄存器设置串口为非FIFO模式;步骤S14、基于调制解调控制寄存器设置串口为DTR+RTS;步骤S15、串口波特率为默认值。
[0011]进一步的,所述步骤S3具体包括:步骤S31、读取通用寄存器Xi的值,其中,i=0,1,2,

,29;步骤S32、获取通用寄存器Xi的值的高56

63位数字;步骤S33、将数字转换成ASCII表的
‘0‑9’


a

f

;步骤S34、读取串口的线路状态寄存器,若线路状态寄存器为非空闲状态,则执行nop指令,重新读取串口的线路状态寄存器,若线路状态寄存器为空闲状态,则通过串口的基础寄存器地址输出1字节数据;步骤S35、获取通用寄存器Xi的值的高48

55位数字;执行步骤S33

S34;步骤S36、以此类推,直至取得通用寄存器Xi的值的0

7位数字,执行步骤S33

S34。
[0012]进一步的,所述步骤S4具体包括:基于mrs指令读取系统寄存器的值到通用寄存器X0中,调用步骤S3打印通用寄存器X0的值。
[0013]进一步的,所述系统寄存器包括sp寄存器、lr寄存器、pc寄存器、spsr寄存器和elr寄存器。
[0014]本专利技术的一种调试Linux内核的方法的有益效果为:通过在内核启动第一行汇编语句之前通过汇编语言对串口进行初始化,并通过汇编语言循环输出高8位并映射到ASCII
‘0‑9’


a

f

段作为人类可读数据对所有通用寄存器及sp、lr、pc、spsr、elr系统寄存器的值进行输出的方式来实现Linux内核的早期调试功能。
附图说明
[0015]下面结合附图和具体实施方式对本专利技术作进一步详细的说明。
[0016]图1是本专利技术的调试Linux内核的方法流程示意图。
具体实施方式
[0017]下面结合本专利技术实施例中的附图,对本专利技术实施例中的技术方案进行清楚、完整地描述。在下面的描述中阐述了很多具体细节以便于充分理解本专利技术,但是本专利技术还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本专利技术内涵的情况下做类似推广,因此本专利技术不受下面公开的具体实施例的限制。
[0018]如图1所示,公开了一种调试Linux内核的方法,以瑞芯微官方提供的5.10内核,基于Firefly的瑞芯微RK3568开发板硬件平台为例,首先部署瑞芯微官方提供的5.10 SDK到Firefly开发板中,之后执行如下步骤:步骤S1、通过串口的控制寄存器初始化串口,具体的:基于线性控制寄存器设置串口为8n1模式;基于中断使能控制器设置串口为非中断模式;基于FIFO控制寄存器设置串口为非FIFO模式;基于调制解调控制寄存器设置串口为DTR+RTS;串口波特率为默认值。
[0019]步骤S2、保存通用寄存器X0

X29的值至堆栈sp中;
通用寄存器是CPU本身用于数据计算、存储过程数据用的寄存器,在ARM架构下通常是X0

X29。系统寄存器是ARM架构下用于控制CPU状态的寄存器,通常不能用于数据计算;目前,SoC,即system on chip,包括CPU以及外设控制器、RAM、ROM等设备,而外设控制器一般是用于控制CPU的外围设备,如常见的外设控制器有:hdmi外设控制器、串口外设控制器、usb外设控制器等。这些外设控制器都集成在SoC内部,为了控制这些寄存器,SoC提供了一系列对应的寄存器。如为了控制串口控制器,提供了基础寄存器、线性控制寄存器、中断使能寄存器、FIFO控制寄存器、调制解调控制器寄存器等。
[0020]步骤S3、顺次打印通用寄存器:步骤S31、读取通用寄存器Xi的值,其中,i=0,1,2,

,29;步骤S32、获取通用寄存器Xi的值的高56

63位数字;步骤S33、将数字转换成ASCII表的
‘0‑9’


a

f

;步骤S34、读取串口的线路状态寄存器,若线路状态寄存器为非空本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种调试Linux内核的方法,其特征在于,包括以下步骤:步骤S1、通过串口的控制寄存器初始化串口;步骤S2、保存通用寄存器X0

X29的值至堆栈sp中;步骤S3、顺次打印通用寄存器;步骤S4、将系统寄存器的值读取至通用寄存器中,重复步骤S3;步骤S5、从堆栈sp中恢复通用寄存器X0

X29;步骤S6、编译修改后的内核并部署。2.基于权利要求1所述的一种调试Linux内核的方法,其特征在于,所述步骤S1具体包括:步骤S11、基于线性控制寄存器设置串口为8n1模式;步骤S12、基于中断使能控制器设置串口为非中断模式;步骤S13、基于FIFO控制寄存器设置串口为非FIFO模式;步骤S14、基于调制解调控制寄存器设置串口为DTR+RTS;步骤S15、串口波特率为默认值。3.基于权利要求1所述的一种调试Linux内核的方法,其特征在于,所述步骤S3具体包括:步骤S31、读取通用寄存器Xi的值,其中,i=0,1,2,

,29;步骤S32、获取通用寄存器Xi的值的高56

63位数字;步骤...

【专利技术属性】
技术研发人员:郭皓赵峰申利飞
申请(专利权)人:麒麟软件有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1