CN117891569A - 一种基于eBPF的linux实时系统调试方法 - Google Patents

一种基于eBPF的linux实时系统调试方法 Download PDF

Info

Publication number
CN117891569A
CN117891569A CN202311733849.5A CN202311733849A CN117891569A CN 117891569 A CN117891569 A CN 117891569A CN 202311733849 A CN202311733849 A CN 202311733849A CN 117891569 A CN117891569 A CN 117891569A
Authority
CN
China
Prior art keywords
ebpf
time
space program
task
interrupt processing
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.)
Pending
Application number
CN202311733849.5A
Other languages
English (en)
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 CN202311733849.5A priority Critical patent/CN117891569A/zh
Publication of CN117891569A publication Critical patent/CN117891569A/zh
Pending legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

本发明涉及实时系统技术领域,具体提供一种基于eBPF的linux实时系统调试方法,旨在解决现有技术中对于linux实时系统在调试时只能获取一个运行时间,无法满足实际需要的技术问题。为此目的,本发明的调试方法,包括步骤:编写eBPF监控程序;将eBPF内核空间程序加载到linux实时系统的中断处理和任务调度的加载点上;当linux实时系统进行中断处理和/或任务调度时,eBPF内核空间程序获取中断处理信息和/或任务调度信息;eBPF内核空间程序将获取的中断处理信息和/或任务调度信息发送到eBPF用户空间程序;eBPF用户空间程序对接收到的中断处理信息和/或任务调度信息存储和统计,并进行展示。

Description

一种基于eBPF的linux实时系统调试方法
技术领域
本发明涉及实时系统技术领域,具体提供一种基于eBPF的linux实时系统调试方法。
背景技术
实时系统指系统计算的正确性,不仅取决于计算的逻辑正确性,还取决于产生计算结果的时间。如果未满足系统的时间约束,则认为系统失效,所以要求计算机在逻辑正确的前提下,系统计算结果必须在规定的时限之内完成,否则将会产生灾难性的后果。
当实时任务不能满足系统的时间约束,即实时线程在设定的时间范围内没有得到调度,就需要系统工程师进行调试以排查故障的原因。通常,系统工程师使用rt-tests来调试实时系统,由于rt-tests是用户空间的程序,只能提供一个延迟总量。但是linux实时系统从中断到高优先级任务被调度运行,中间要经过多个步骤,一个延迟总量无法描述出问题具体出现在哪个步骤。
相应地,本领域需要一种新的linux实时系统调试方案来解决上述问题。
发明内容
为了克服上述缺陷,提出了本发明,解决现有技术中对于linux实时系统在调试时只能获取一个运行时间,无法满足实际需要的技术问题。
本发明提出了一种基于eBPF的linux实时系统调试方法,包括步骤:
编写eBPF监控程序,所述eBPF监控程序包括eBPF内核空间程序和eBPF用户空间程序;
通过eBPF技术将eBPF内核空间程序加载到linux实时系统的中断处理和任务调度的加载点上;
当linux实时系统进行中断处理和/或任务调度时,触发所述eBPF内核空间程序,所述eBPF内核空间程序获取中断处理信息和/或任务调度信息;
所述eBPF内核空间程序将获取的中断处理信息和/或任务调度信息发送到eBPF用户空间程序;
所述eBPF用户空间程序对接收到的中断处理信息和/或任务调度信息存储和统计,并进行展示。
在上述调试方法的进一步技术方案中,所述加载点包括linux静态跟踪点、函数入口地址和函数返回地址。
在上述调试方法的进一步技术方案中,加载到函数入口地址的eBPF内核空间程序用于获取函数的开始值。
在上述调试方法的进一步技术方案中,加载到函数返回地址的eBPF内核空间程序用于获取函数的返回值。
在上述调试方法的进一步技术方案中,所述中断处理包括硬件中断、软中断和不可屏蔽中断。
在上述调试方法的进一步技术方案中,所述中断处理信息包括中断号、中断处理所消耗的时间和处理该中断的cpu id。
在上述调试方法的进一步技术方案中,所述任务调度信息包括任务抢占时间、任务切换时间、被抢占任务的名称和id、抢占任务的名称和id。
在上述调试方法的进一步技术方案中,所述eBPF用户空间程序通过命令行或可视化图表进行展示。
在上述调试方法的进一步技术方案中,所述方法还包括步骤:
根据预设的门限值,对中断处理和/或任务调度中的步骤进行告警。
在上述调试方法的进一步技术方案中,所述门限值包括中断处理时间门限值、软中断处理时间门限值、不可屏蔽中断处理时间门限值、任务抢占时间门限值和任务切换时间门限值中的一种或多种。
本发明的工作原理和有益效果为:
在实施本发明的技术方案中,通过将编写的eBPF内核空间程序加载到相应的加载点,在中断处理或任务调度运行时,记录运行过程中涉及到多个步骤的运行时间,再通过eBPF内核空间程序和eBPF用户空间程序之间的交互,将eBPF内核空间程序获取到的相关信息传输到eBPF用户空间程序存储、统计并显示,实现linux实时系统从中断到高优先级任务被调度运行中间多个步骤运行时间的获取。
附图说明
参照附图,本发明的公开内容将变得更易理解。本领域技术人员容易理解的是:这些附图仅仅用于说明的目的,而并非意在对本发明的保护范围组成限制。此外,图中类似的数字用以表示类似的部件,其中:
图1是本发明一种基于eBPF的linux实时系统调试方法的主要步骤流程示意图;
图2是本发明一种基于eBPF的linux实时系统调试装置的结构原理框图。
具体实施方式
下面参照附图来描述本发明的一些实施方式。本领域技术人员应当理解的是,这些实施方式仅仅用于解释本发明的技术原理,并非旨在限制本发明的保护范围。
实施例1
图1是本发明一种基于eBPF的linux实时系统调试方法的主要步骤流程示意图。如图1所示,本实施例中的一种基于eBPF的linux实时系统调试方法主要包括下列步骤S1-步骤S5。
步骤S1:针对linux实时系统编写eBPF监控程序,eBPF监控程序包括eBPF内核空间程序和eBPF用户空间程序。
本实施例中,eBPF内核空间程序和eBPF用户空间程序通过eBPF maps机制进行命令和数据的交换,eBPF内核空间程序通过llvm编译器编译为eBPF字节码,运行的时候,linux内核首先使用JIT技术将其转换为CPU架构的指令,然后开始运行。
可选的,CPU架构可以包括但不限于ARM,X86,MIPS或RISC-V。
步骤S2:通过eBPF技术将eBPF内核空间程序加载到linux实时系统的中断处理和任务调度的加载点上。
本实施例中,加载点包括两种类型,分别是:
trace event,即linux静态跟踪点,它通过TRACE_EVENT宏静态定义了一系列的trace event,每个 trace event都会与一个回调函数链表关联,一般用于打印一些信息到内存环形队列,eBPF的内核函数可以加载到回调函数链表中。
Function trace,包括函数入口地址和函数返回地址,加载到函数入口地址的eBPF内核空间程序用于获取函数的开始值。加载到函数返回地址的eBPF内核空间程序用于获取函数的返回值。通过内核编译阶段在函数入口和返回处插入钩子函数,运行时对于指定的跟踪函数,将钩子函数替换为要执行的回调函数,在回调函数中记录函数调用关系,并写入ftrace的ring buffer,eBPF的内核函数可以加载到钩子函数的位置。
本实施例中,中断处理包括硬件中断、软中断和不可屏蔽中断。
eBPF内核空间程序加载到如下加载点:irq_handler_entry和irq_handler_exit,用于获取硬件中断的运行时间,其中,irq_handler_entry和irq_handler_exit均为traceevent类型的加载点。
eBPF内核程序还可以加载到softirq_entry和softirq_exit加载点,用于获取软中断的运行时间,其中softirq_entry和softirq_exit为trace event类型的加载点。
eBPF内核程序还可以加载到nmi_enter和nmi_exit加载点,用于获取不可屏蔽中断的运行时间,其中nmi_entry和nmi_exit为trace event类型的加载点。
本实施例中,对于任务调度,eBPF内核空间程序加载到如下加载点:sched_waking、try_to_wake_up、sched_switch和finish_task_switch,其中,sched_waking和sched_switch为trace event类型的加载点,try_to_wake_up和finish_task_switch为Function trace类型加载点,try_to_wake_up用于eBPF内核空间程序加载到该函数的返回处,finish_task_switch用于eBPF内核空间程序加载到该函数的入口处。
步骤S3:当linux实时系统进行中断处理和/或任务调度时,触发eBPF内核空间程序,eBPF内核空间程序获取中断处理信息和/或任务调度信息。
本实施例中,中断处理信息包括中断号,中断处理所消耗的时间和处理该中断的cpu id。
eBPF内核空间程序获取硬件中断信息的过程为:eBPF内核空间程序先在加载点irq_handler_entry的回调函数中,记录该中断的中断号、cpu id和当前的系统时间,也就是中断处理开始的时间,并保存到eBPF map中,然后,eBPF内核空间程序在加载点irq_handler_exit的回调函数中记录当前时间,也就是中断处理结束的时间,同时在eBPF map中找到中断处理开始的时间,相减后得到中断处理所消耗的时间。
本实施例中,任务调度信息包括任务抢占时间、任务切换时间、被抢占任务的名称和id、抢占任务的名称和id,任务抢占时间即将新任务放到任务调度队列的过程,任务切换时间即将旧任务在CPU寄存器的信息保存到该任务的栈内,将新任务CPU寄存器的信息从该任务栈内拷贝到CPU寄存器的过程。
eBPF内核空间程序获取任务调度信息的过程为:eBPF内核空间程序在加载点sched_waking的回调函数中记录新任务的pid、优先级、名称以及当前时间,即任务抢占开始时间,并保存到eBPF map中,然后,eBPF内核空间程序在加载点try_to_wake_up的回调函数中记录当前时间,即任务抢占的结束时间,同时在eBPF map中找到任务抢占开始时间,相减后得到任务抢占时间。eBPF内核空间程序在加载点finish_task_switch的回调函数中记录当前时间,即任务抢占的结束时间,同时在eBPF map中找到任务抢占开始时间,相减后得到任务切换时间。
抢占任务即新任务,被强占任务即原任务,抢占任务的名称和id通过上述过程获取,被抢占任务的名称和id在linux内核里可以从全局变量current获取。
步骤S4:eBPF内核空间程序将获取的中断处理信息和/或任务调度信息发送到eBPF用户空间程序。
步骤S5:eBPF用户空间程序对接收到的中断处理信息和/或任务调度信息存储和统计,并进行展示。
本实施例中,eBPF用户空间程序可以将信息存储到内存的环形队列中,在测试结束后,将内存环形队列的内容转储到磁盘文件中,用于后续分析。同时,可以统计出各项信息指标的平均值,最低值和最高值。根据统计的各项信息指标, eBPF用户空间程序通过命令行或可视化图表进行展示。
基于上述步骤S1-步骤S5,通过将编写的eBPF内核空间程序加载到相应的加载点,在中断处理或任务调度运行时,记录运行过程中涉及到多个步骤的运行时间,再通过eBPF内核空间程序和eBPF用户空间程序之间的交互,将eBPF内核空间程序获取到的相关信息传输到eBPF用户空间程序存储、统计并显示,实现linux实时系统从中断到高优先级任务被调度运行中间多个步骤运行时间的获取。
需要指出的是,尽管上述实施例中将各个步骤按照特定的先后顺序进行了描述,但是本领域技术人员可以理解,为了实现本发明的效果,不同的步骤之间并非必须按照这样的顺序执行,其可以同时(并行)执行或以其他顺序执行,这些变化都在本发明的保护范围之内。
实施例2
在实施例1的基础上,本实施例中的系统调试方法还包括步骤S6:根据预设的门限值,对中断处理和/或任务调度中的步骤进行告警。
本实施例中,门限值包括中断处理时间门限值、软中断处理时间门限值、不可屏蔽中断处理时间门限值、任务抢占时间门限值和任务切换时间门限值中的一种或多种。根据内核工程师预设的门限值,当指标超过门限值之后,可以使用高亮标注方式告警。
实施例3
在实施例1或实施例2的基础上,linux实时系统所关注的指标除了上述的中断处理和任务调度之外,还包括死锁解除时间、信号混洗时间和消息传递时间。
本实施例中,eBPF内核程序还用于获取死锁解除时间、信号混洗时间和消息传递时间。其中,死锁解除时间为任务A释放一个锁,调度器将等待该锁的任务B运行起来所消耗的时间。信号混洗时间为任务A释放一个信号,调度器将等待该信号的任务B运行起来所消耗的时间。消息传递时间为任务A发送一个消息到任务B的消息队列中,调度器将等待该消息的任务B运行起来所消耗的时间。
获取死锁解除时间的步骤为:通过eBPF技术将eBPF内核空间程序加载到linux实时系统的加载点futex_wake入口地址和futex_wait返回地址。eBPF内核程序的回调函数在futex_wake入口地址被执行,记录当前时间,即死锁解除的开始时间,并保存到eBPF map中,eBPF内核程序的回调函数在futex_wait返回地址被执行,记录当前时间,即死锁解除的结束时间,同时在eBPF map中找到死锁解除的开始时间,相减后得到死锁解除时间。
获取信号混洗时间的步骤为:通过eBPF技术将eBPF内核空间程序加载到linux实时系统的加载点sys_enter_tgkill和sys_exit_rt_sigtimedwait,其中,加载点sys_enter_tgkill和sys_exit_rt_sigtimedwait属于trace event类型。通过eBPF内核程序的回调函数在sys_enter_tgkill被调用时执行,记录当前时间,即信号混洗的开始时间,并保存到eBPF map中,eBPF内核程序的回调函数在sys_exit_rt_sigtimedwait被调用时执行,记录当前时间,即信号混洗的结束时间,同时在eBPF map中找到信号混洗的开始时间,相减后得到信号混洗时间。
获取消息传递时间的步骤为:通过eBPF技术将eBPF内核空间程序加载到linux实时系统的加载点do_mq_timedsend入口地址和do_mq_timedreceive返回地址。通过eBPF内核程序的回调函数在do_mq_timedsend入口地址被执行,记录当前时间,即消息传递的开始时间,并保存到eBPF map中,eBPF内核程序的回调函数在do_mq_timedreceive返回地址被执行,记录当前时间,即消息的结束时间,同时在eBPF map中找到消息传递的开始时间,相减后得到消息传递时间。
实施例4
图2为本发明一种基于eBPF的linux实时系统调试装置的结构原理框图,包括:
初始化模块,用于通过eBPF用户空间程序将eBPF内核程序加载到内核的加载点上,当linux实时内核运行到该些加载点的时候,eBPF内核程序就会同时被运行。
信息收集模块,用于将eBPF用户空间程序从eBPF内核程序获取的信息收集保存,优选的,在eBPF用户空间程序将信息保存到内存的环形队列之后,该信息收集模块可以在测试结束后,将内存环形队列的内容转储到磁盘文件中,用于后续分析。
信息展示模块,将保存的信息进行展示,展示的内容包括各项信息指标的平均值,最低值和最高值,展示的方法可以使用命令行或者图形化的方式。
Chensong:eBPF用户空间程序首先将eBPF内核程序的字节码通过系统调用,传递给linux内核的eBPF core模块,eBPF core对字节码进行安全检测,其中包括但不限于语法错误,逻辑分析,权限控制等,如果没有问题,eBPF core通过JIT(Just-In-Time)技术将eBPF内核程序的字节码编译成CPU可以执行的机器码,最后,将eBPF内核程序加载到内核的加载点上,eBPF内核程序与eBPF用户空间程序通过eBPF maps交换指令和数据。
至此,已经结合附图所示的优选实施方式描述了本发明的技术方案,但是,本领域技术人员容易理解的是,本发明的保护范围显然不局限于这些具体实施方式。在不偏离本发明的原理的前提下,本领域技术人员可以对相关技术特征作出等同的更改或替换,这些更改或替换之后的技术方案都将落入本发明的保护范围之内。

Claims (10)

1.一种基于eBPF的linux实时系统调试方法,其特征在于,包括步骤:
编写eBPF监控程序,所述eBPF监控程序包括eBPF内核空间程序和eBPF用户空间程序;
通过eBPF技术将eBPF内核空间程序加载到linux实时系统的中断处理和任务调度的加载点上;
当linux实时系统进行中断处理和/或任务调度时,触发所述eBPF内核空间程序,所述eBPF内核空间程序获取中断处理信息和/或任务调度信息;
所述eBPF内核空间程序将获取的中断处理信息和/或任务调度信息发送到eBPF用户空间程序;
所述eBPF用户空间程序对接收到的中断处理信息和/或任务调度信息存储和统计,并进行展示。
2.根据权利要求1所述的一种基于eBPF的linux实时系统调试方法,其特征在于,所述加载点包括linux静态跟踪点、函数入口地址和函数返回地址。
3.根据权利要求2所述的一种基于eBPF的linux实时系统调试方法,其特征在于,加载到函数入口地址的eBPF内核空间程序用于获取函数的开始值。
4.根据权利要求2所述的一种基于eBPF的linux实时系统调试方法,其特征在于,加载到函数返回地址的eBPF内核空间程序用于获取函数的返回值。
5.根据权利要求1所述的一种基于eBPF的linux实时系统调试方法,其特征在于,所述中断处理包括硬件中断、软中断和不可屏蔽中断。
6.根据权利要求1所述的一种基于eBPF的linux实时系统调试方法,其特征在于,所述中断处理信息包括中断号、中断处理所消耗的时间和处理该中断的cpu id。
7.根据权利要求1所述的一种基于eBPF的linux实时系统调试方法,其特征在于,所述任务调度信息包括任务抢占时间、任务切换时间、被抢占任务的名称和id、抢占任务的名称和id。
8.根据权利要求1所述的一种基于eBPF的linux实时系统调试方法,其特征在于,所述eBPF用户空间程序通过命令行或可视化图表进行展示。
9.根据权利要求1所述的一种基于eBPF的linux实时系统调试方法,其特征在于,所述方法还包括步骤:
根据预设的门限值,对中断处理和/或任务调度中的步骤进行告警。
10.根据权利要求9所述的一种基于eBPF的linux实时系统调试方法,其特征在于,所述门限值包括中断处理时间门限值、软中断处理时间门限值、不可屏蔽中断处理时间门限值、任务抢占时间门限值和任务切换时间门限值中的一种或多种。
CN202311733849.5A 2023-12-15 2023-12-15 一种基于eBPF的linux实时系统调试方法 Pending CN117891569A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311733849.5A CN117891569A (zh) 2023-12-15 2023-12-15 一种基于eBPF的linux实时系统调试方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311733849.5A CN117891569A (zh) 2023-12-15 2023-12-15 一种基于eBPF的linux实时系统调试方法

Publications (1)

Publication Number Publication Date
CN117891569A true CN117891569A (zh) 2024-04-16

Family

ID=90640171

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311733849.5A Pending CN117891569A (zh) 2023-12-15 2023-12-15 一种基于eBPF的linux实时系统调试方法

Country Status (1)

Country Link
CN (1) CN117891569A (zh)

Similar Documents

Publication Publication Date Title
US9886305B2 (en) Determining the status of plurality of threads by monitoring the execution of folded thread
US7287135B2 (en) Adapting RCU for real-time operating system usage
US9268666B2 (en) System and method for debugging of computer programs
US8239838B2 (en) Kernel-aware debugging system, medium, and method
KR101143214B1 (ko) 멀티스레드된 프로그램에서의 잠재적 레이스를 검출하기위한 방법 및 시스템
US8141053B2 (en) Call stack sampling using a virtual machine
US8903703B2 (en) Dynamically adjusting speed versus accuracy of computer platform simulation
US9798595B2 (en) Transparent user mode scheduling on traditional threading systems
US20080301417A1 (en) System and Method for Debugging of Computer
US20090193298A1 (en) System and method of fault detection, diagnosis and prevention for complex computing systems
US20040268315A1 (en) System and method for processing breakpoint events in a child process generated by a parent process
US8806445B2 (en) Thread serialization and disablement tool
CN104461876A (zh) 一种基于运行快照序列的并行程序重现调试方法
US7793160B1 (en) Systems and methods for tracing errors
CN109992388B (zh) 一种用于核电厂安全级设备软件多任务管理系统
CN117891569A (zh) 一种基于eBPF的linux实时系统调试方法
Huang et al. Investigating time properties of interrupt-driven programs
Huang et al. A denotational model for interrupt-driven programs
WO2006091785A1 (en) Interface converter for unified view of multiple computer system simulations
CN117992192A (zh) 一种嵌入式操作系统任务调度及中断追踪方法
Hölscher Nested Preemption Fixed-Priority Scheduler for EV3OSEK
CN115061842A (zh) 一种数据处理方法、装置、设备和存储介质
Buechler et al. Software error detection
CN118152121A (zh) 一种资源管理方法、装置、电子设备及存储介质
SE524799C2 (sv) Förfarande och dataprogram för debuggning av en programkod

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