CN116361195B - 一种调试Linux内核的方法 - Google Patents

一种调试Linux内核的方法 Download PDF

Info

Publication number
CN116361195B
CN116361195B CN202310587111.6A CN202310587111A CN116361195B CN 116361195 B CN116361195 B CN 116361195B CN 202310587111 A CN202310587111 A CN 202310587111A CN 116361195 B CN116361195 B CN 116361195B
Authority
CN
China
Prior art keywords
register
serial port
registers
general
value
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202310587111.6A
Other languages
English (en)
Other versions
CN116361195A (zh
Inventor
郭皓
赵峰
申利飞
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Kirin Software Co Ltd
Original Assignee
Kirin Software Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Kirin Software Co Ltd filed Critical Kirin Software Co Ltd
Priority to CN202310587111.6A priority Critical patent/CN116361195B/zh
Publication of CN116361195A publication Critical patent/CN116361195A/zh
Application granted granted Critical
Publication of CN116361195B publication Critical patent/CN116361195B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/362Software debugging
    • G06F11/3644Software debugging by instrumenting at runtime
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)

Abstract

本发明提供一种调试Linux内核的方法,包括以下步骤:步骤S1、通过串口的控制寄存器初始化串口;步骤S2、保存通用寄存器X0‑X29的值至堆栈sp中;步骤S3、顺次打印通用寄存器;步骤S4、将系统寄存器的值读取至通用寄存器中,重复步骤S3;步骤S5、从堆栈sp中恢复通用寄存器X0‑X29;步骤S6、编译修改后的内核并部署。对串口进行初始化,并通过汇编语言循环输出高8位并映射到ASCII‘0‑9’、‘a‑f’段作为人类可读数据对所有通用寄存器及sp、lr、pc、spsr、elr系统寄存器的值进行输出的方式来实现Linux内核的早期调试功能。

Description

一种调试Linux内核的方法
技术领域
本发明涉及一种内核调试技术领域,尤其涉及一种调试Linux内核的方法。
背景技术
操作系统厂商有自身产品规划,尤其是Linux内核,不会轻易为了某一款芯片或某一个硬件平台更换他们的Linux内核。但是在嵌入式领域中,芯片厂商提供的内核版本并不一定与操作系统厂商的内核版本相同或相近,在操作系统厂商移植芯片厂商提供的内核时经常遇到内核无输出的情况,而操作系统厂商使用的硬件设备可能没有JTAG接口,这使得操作系统厂商在移植内核时造成比较大的困难。
常调试内核的手段有四种:
第一种,通过printk函数使用串口输出日志进行调试。这种方法在内核已经适配的情况下可以使用,但是在内核移植阶段的初期,芯片可能初始化没有成功,串口并未启动,所以无法使用printk函数进行日志调试追踪。
第二种,通过gdb进行在线调试。这种方法至少需要串口能够运行,内核移植初期也无法适用。
第三种,通过JTAG设备进行调试。这种方式需要使用引出了JTAG引脚的设备进行调试,这种设备操作系统厂商不一定能拿到,不具备通用性。
第四种,通过点亮板载LED灯的方式调试。这种方式对于不同设备LED等的链接地址不尽相同,需要针对每一个设备进行编写代码。而且这种方式不能输出数据,只能判断执行结果是否满足预期,调试的可操作性和灵活性较差。
因此,如何在Linux内核代码汇编函数入口前,实现Linux内核启动前期的调试功能是本领域技术人员亟需解决的技术问题。
发明内容
针对上述问题,本发明提供一种调试Linux内核的方法;通过在Linux内核代码汇编函数入口前,使用汇编语言对串口进行初始化,再打印所有的通用寄存器及sp、lr、pc、spsr、elr寄存器,从而实现linux内核启动前期的调试功能。
为实现上述目的,本发明公开了一种调试Linux内核的方法,包括以下步骤:
步骤S1、通过串口的控制寄存器初始化串口;
步骤S2、保存通用寄存器X0-X29的值至堆栈sp中;
步骤S3、顺次打印通用寄存器;
步骤S4、将系统寄存器的值读取至通用寄存器中,重复步骤S3;
步骤S5、从堆栈sp中恢复通用寄存器X0-X29;
步骤S6、编译修改后的内核并部署。
进一步的,所述步骤S1具体包括:
步骤S11、基于线性控制寄存器设置串口为8n1模式;
步骤S12、基于中断使能控制器设置串口为非中断模式;
步骤S13、基于FIFO控制寄存器设置串口为非FIFO模式;
步骤S14、基于调制解调控制寄存器设置串口为DTR+RTS;
步骤S15、串口波特率为默认值。
进一步的,所述步骤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。
进一步的,所述步骤S4具体包括:
基于mrs指令读取系统寄存器的值到通用寄存器X0中,调用步骤S3打印通用寄存器X0的值。
进一步的,所述系统寄存器包括sp寄存器、lr寄存器、pc寄存器、spsr寄存器和elr寄存器。
本发明的一种调试Linux内核的方法的有益效果为:通过在内核启动第一行汇编语句之前通过汇编语言对串口进行初始化,并通过汇编语言循环输出高8位并映射到ASCII‘0-9’、‘a-f’段作为人类可读数据对所有通用寄存器及sp、lr、pc、spsr、elr系统寄存器的值进行输出的方式来实现Linux内核的早期调试功能。
附图说明
下面结合附图和具体实施方式对本发明作进一步详细的说明。
图1是本发明的调试Linux内核的方法流程示意图。
具体实施方式
下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。在下面的描述中阐述了很多具体细节以便于充分理解本发明,但是本发明还可以采用其他不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本发明内涵的情况下做类似推广,因此本发明不受下面公开的具体实施例的限制。
如图1所示,公开了一种调试Linux内核的方法,以瑞芯微官方提供的5.10内核,基于Firefly的瑞芯微RK3568开发板硬件平台为例,首先部署瑞芯微官方提供的5.10 SDK到Firefly开发板中,之后执行如下步骤:
步骤S1、通过串口的控制寄存器初始化串口,具体的:基于线性控制寄存器设置串口为8n1模式;基于中断使能控制器设置串口为非中断模式;基于FIFO控制寄存器设置串口为非FIFO模式;基于调制解调控制寄存器设置串口为DTR+RTS;串口波特率为默认值。
步骤S2、保存通用寄存器X0-X29的值至堆栈sp中;
通用寄存器是CPU本身用于数据计算、存储过程数据用的寄存器,在ARM架构下通常是X0-X29。系统寄存器是ARM架构下用于控制CPU状态的寄存器,通常不能用于数据计算;
目前,SoC,即system on chip,包括CPU以及外设控制器、RAM、ROM等设备,而外设控制器一般是用于控制CPU的外围设备,如常见的外设控制器有:hdmi外设控制器、串口外设控制器、usb外设控制器等。这些外设控制器都集成在SoC内部,为了控制这些寄存器,SoC提供了一系列对应的寄存器。如为了控制串口控制器,提供了基础寄存器、线性控制寄存器、中断使能寄存器、FIFO控制寄存器、调制解调控制器寄存器等。
步骤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。
一个数字在计算机内部是二进制存储的。当前计算机都是64位(64bit)计算机。1个字节为8位(8bit),所以1个数字通常需要16个字节表示,如果要输出64bit,例如:十进制数字:1234567890123456789,在计算机内部使用二进制存储为0001 0001 0010 0010 00010000 1111 0100 0111 1101 1110 1001 1000 0001 0001 0101,为增强可读性,用十六进制表示为1122 10F4 7DE9 8115;
在使用串口输出数据时,只需要往串口的基础寄存器中写入值即可完成输出操作;
串口在输出数据时,一次只能输出1个字节,即8bit,为了完整输出这个数字,需要依次输出高56-63位、高48-55位、高40-47位……高0-7位。即需要输出11、22、10、F4、7D、E9、81、15。
步骤S4、基于mrs指令读取系统寄存器的值到通用寄存器X0中,调用步骤S3打印通用寄存器X0的值,从而实现系统寄存器(也即sp寄存器、lr寄存器、pc寄存器、spsr寄存器、elr寄存器)的打印;
步骤S5、从堆栈sp中恢复通用寄存器X0-X29;
步骤S6、编译修改后的内核并部署,重启后进入新内核,可以在串口的最前面看到调试信息。
因此,本申请通过在内核启动第一行汇编语句之前通过汇编语言对串口进行初始化,并通过汇编语言循环输出高8位并映射到ASCII‘0-9’、‘a-f’段作为人类可读数据对所以通用寄存器及sp、lr、pc、spsr、elr系统寄存器的值进行输出的方式来实现Linux内核的早期调试功能,能够给Linux内核工程师在调试内核早期启动时提供较大的帮助,无需借助JTAG设备,能够方便快捷的输出通用寄存器、系统寄存器和当前CPU的调用栈回溯信息。
显然,所描述的实施例仅仅是本发明的一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

Claims (4)

1.一种调试Linux内核的方法,其特征在于,包括以下步骤:
步骤S1、通过串口的控制寄存器初始化串口;
步骤S2、保存通用寄存器X0-X29的值至堆栈sp中;
步骤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;
步骤S4、将系统寄存器的值读取至通用寄存器中,重复步骤S3;
步骤S5、从堆栈sp中恢复通用寄存器X0-X29;
步骤S6、编译修改后的内核并部署。
2.基于权利要求1所述的一种调试Linux内核的方法,其特征在于,所述步骤S1具体包括:
步骤S11、基于线性控制寄存器设置串口为8n1模式;
步骤S12、基于中断使能控制器设置串口为非中断模式;
步骤S13、基于FIFO控制寄存器设置串口为非FIFO模式;
步骤S14、基于调制解调控制寄存器设置串口为DTR+RTS;
步骤S15、串口波特率为默认值。
3.基于权利要求1所述的一种调试Linux内核的方法,其特征在于,所述步骤S4具体包括:
基于mrs指令读取系统寄存器的值到通用寄存器X0中,调用步骤S3打印通用寄存器X0的值,从而实现系统寄存器的打印。
4.基于权利要求3所述的一种调试Linux内核的方法,其特征在于,所述系统寄存器包括sp寄存器、lr寄存器、pc寄存器、spsr寄存器和elr寄存器。
CN202310587111.6A 2023-05-24 2023-05-24 一种调试Linux内核的方法 Active CN116361195B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202310587111.6A CN116361195B (zh) 2023-05-24 2023-05-24 一种调试Linux内核的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202310587111.6A CN116361195B (zh) 2023-05-24 2023-05-24 一种调试Linux内核的方法

Publications (2)

Publication Number Publication Date
CN116361195A CN116361195A (zh) 2023-06-30
CN116361195B true CN116361195B (zh) 2023-08-22

Family

ID=86910005

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202310587111.6A Active CN116361195B (zh) 2023-05-24 2023-05-24 一种调试Linux内核的方法

Country Status (1)

Country Link
CN (1) CN116361195B (zh)

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR19990079373A (ko) * 1998-04-04 1999-11-05 윤종용 마이크로컨트롤러의 바운더리 스캔 스탠다드 인터페이스를 이용한 디버깅 방법
KR20010048714A (ko) * 1999-11-29 2001-06-15 오길록 다중 노드 시스템상에서의 단일 콘솔을 위한 콘솔 구동기운용 방법
CN101281488A (zh) * 2007-04-06 2008-10-08 上海宇梦通信科技有限公司 Linux操作系统的内核调试方法
CN102662844A (zh) * 2012-04-12 2012-09-12 深圳市共进电子股份有限公司 一种linux内核启动时数据跟踪的方法

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR19990079373A (ko) * 1998-04-04 1999-11-05 윤종용 마이크로컨트롤러의 바운더리 스캔 스탠다드 인터페이스를 이용한 디버깅 방법
KR20010048714A (ko) * 1999-11-29 2001-06-15 오길록 다중 노드 시스템상에서의 단일 콘솔을 위한 콘솔 구동기운용 방법
CN101281488A (zh) * 2007-04-06 2008-10-08 上海宇梦通信科技有限公司 Linux操作系统的内核调试方法
CN102662844A (zh) * 2012-04-12 2012-09-12 深圳市共进电子股份有限公司 一种linux内核启动时数据跟踪的方法

Also Published As

Publication number Publication date
CN116361195A (zh) 2023-06-30

Similar Documents

Publication Publication Date Title
US6948164B2 (en) Method and system for modifying executable code to add additional functionality
CN110634530A (zh) 芯片的测试系统和测试方法
US20040010773A1 (en) Method and apparatus for displaying debug codes of a baisc input/output system
CN1273897C (zh) 一种单元测试自动化方法
CN112882995A (zh) 脚本自动生成方法、装置、电子设备及存储介质
CN100367226C (zh) 一种利用智能设备的固件实现部件检测的方法
CN101916223A (zh) 程序调试方法及系统
US6904484B1 (en) Low pin count (LPC) firmware hub recovery
US9858139B1 (en) Computer system vulnerability analysis apparatus and method
CN116361195B (zh) 一种调试Linux内核的方法
US7657897B2 (en) Methods and apparatus for communicating between multiple levels of software components
US6963344B1 (en) Method and system for utilizing graphics memory to provide storage for video BIOS initialization
CN106980569B (zh) 一种利用usb键盘灯表示bios post进度的方法
US10866922B1 (en) Firmware debug trace capture using serial peripheral interface
CN112214256A (zh) 机器学习的运行控制方法、装置、电子设备及存储介质
CN112765018B (zh) 一种仪器仪表调试系统及方法
CN115328390A (zh) 基于c51的指针变量读写操作方法、装置、设备及介质
CN100414500C (zh) 嵌入式计算机系统的启动信息输出方法
CN114780154A (zh) 一种兼容不同生产厂家主控板硬件状态的方法
US20070239976A1 (en) Message displaying system and method
CN113311931A (zh) 一种方便iap的双复位向量8位mcu架构及其方法
CN102681898A (zh) 提高autosar os mcal驱动代码可移植性的方法
US11921614B2 (en) System and method for developing, testing and debugging software for microcontrollers
CN117171042B (zh) 基于图形程序用参数配置方法的开发调试系统及方法
US20230205885A1 (en) Operation method of a software program meeting specifications of unified extensible firmware interface for configuring a general-purpose input/output port

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant