一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种面向中断驱动型程序的寄存器访问冲突检测方法与流程

2022-12-20 22:55:31 来源:中国专利 TAG:


1.本发明属于嵌入式程序缺陷分析与正确性保证技术,具体涉及一种面向中断驱动型程序的寄存器访问冲突检测方法。


背景技术:

2.中断驱动型程序通过中断机制来实现对外部事件的响应和处理,被广泛应用于航空航天、汽车电子、交通管理等各种嵌入式系统。在这类程序中,当一个中断源向cpu发出中断请求时,cpu暂停现行程序,转而去响应拥有更高优先级的中断请求,执行该中断请求对应的中断服务程序,待中断服务程序执行完成之后再返回现行程序的断点位置继续执行。
3.在中断驱动型程序中,整个程序由主任务和拥有不同优先级的各中断服务程序组成。将主任务和各中断服务程序都看成不同的任务流,则整个程序由拥有不同优先级的任务流组成,其中主任务对应的任务流的优先级最低。高优先级的任务流可以抢占低优先级的任务流,即在低优先级任务流的执行过程中,若高优先级的任务流发生,系统将暂停低优先级任务流的执行而去执行高优先级任务流,待高优先级任务流执行完成之后再返回低优先级任务流的断点位置继续执行。不同的任务流之间通过共享数据的方式进行通信,即在嵌入式中断驱动型程序中定义全局数据变量,各任务流都可以对该数据进行读写访问。
4.数据访问冲突是中断驱动型程序中的一种典型缺陷,很多安全攸关软件的质量问题都是由数据访问冲突导致的。在中断驱动型程序中,数据访问冲突是指一个低优先级任务流正在访问一个共享数据时,一个高优先级任务流发生,在该高优先级任务流中也访问该共享数据,且两个访问操作中至少有一个写操作。这种情况往往会产生开发人员预期之外的行为,从而导致严重的后果。因此,针对中断驱动型程序开展数据访问冲突分析是保障嵌入式软件正确性的重要内容。但中断发生时机的非确定性给数据访问冲突的分析带来了严峻的挑战。在中断驱动型程序中,即使是对同一个输入,不同的执行都可能产生完全不一样的结果。
5.寄存器访问冲突是数据访问冲突的一种重要类型。在该类型中,发生访问冲突的共享资源是系统中的寄存器。两个不同优先级的任务流都对寄存器资源进行访问操作,若两个访问操作有访问同一地址,且其中至少有一个是写操作,则发生寄存器访问冲突。由于寄存器资源通常都是采取寄存器地址进行访问操作,开发测试人员往往难以发现不同任务流之间的访问冲突,导致寄存器访问冲突成为实际工程中引发代码缺陷的一个重要因素。研究中断驱动型程序中的寄存器访问冲突对保障嵌入式软件的正确性具有重要意义。
6.静态分析是一种常用的数据访问冲突检测技术。该技术采用语法分析、控制流分析和数据流分析等方法,可以在不运行程序的情况下对整个代码进行系统扫描。但为实现对较大规模代码的快速分析,该方法往往忽略每个变量的精确取值,导致静态分析结果通常包含较多误报。同时,现有的静态分析技术主要针对标准c程序和共享变量的数据访问冲突分析,如何对中断驱动型程序中的寄存器访问冲突问题开展有效分析目前研究很少。程序验证是对代码进行精确分析的一种有效技术,该方法通过遍历程序所有可能的状态和路
径来实现对程序行为的精确分析,理论上可分析到程序所有可能的行为。但由于程序的状态和路径空间爆炸问题,现有的程序验证技术能处理的程序规模比较有限。同时,如何在程序验证中表达中断驱动型程序的非确定性语义也是目前研究的一个难点。因此,现有的静态分析和程序验证技术都还难以针对中断驱动程序中的寄存器访问冲突问题开展有效分析。


技术实现要素:

7.经研究发现,要实现嵌入式中断驱动型程序中寄存器访问冲突的检测主要存在的挑战:一是如何在分析过程中表示寄存器操作访问的语义。寄存器访问操作通常是通过特定的方式对寄存器地址进行读写。现有的程序分析工具主要支持对共享变量的读写操作进行分析,不支持对寄存器的访问操作进行分析。因此需要基于现有的程序分析工具和技术实现寄存器操作访问的语义,从而为寄存器访问冲突的检测提供基础。二是如何判断不同寄存器操作访问的是否是同一地址。在寄存器访问操作中,其访问的寄存器地址可能是一个表达式,而不是一个常数。不同的表达式是否可能取相同的值决定了两个寄存器访问操作是否会访问同一地址。而一个表达式的值只有在程序运行起来的时候才能确定,且不同的情况下可能取不同的值。三是如何准确考虑寄存器访问操作的执行条件,包括嵌入式程序中的中断开关操作等。在中断驱动型程序的开发过程中,开发人员通常会采取一些保护措施来避免数据访问冲突,包括开关中断、自定义实现互斥操作等。所以在寄存器访问冲突的分析过程中必须要考虑一个数据访问冲突是否会真实发生,即需要考虑不同寄存器访问操作的执行条件是否能同时成立,否则将产生大量误报。
8.本发明要解决的技术问题:针对现有技术的上述问题,提供一种面向中断驱动型程序的寄存器访问冲突检测方法,本发明能够解决嵌入式中断驱动型程序中寄存器访问冲突的检测主要存在的挑战,包括能够在分析过程中表示寄存器操作访问的语义,判断不同寄存器操作访问的是否是同一地址以及准确考虑寄存器访问操作的执行条件,例如嵌入式程序中的中断开关操作等。
9.为了解决上述技术问题,本发明采用的技术方案为:
10.一种面向中断驱动型程序的寄存器访问冲突检测方法,包括:
11.1)针对给定含寄存器访问操作的嵌入式中断驱动型程序,在嵌入式中断驱动型程序的代码中引入寄存器数组变量,并将所述代码中的寄存器访问操作转化为对寄存器数组变量某元素的读写操作,从而完成基于寄存器数组变量的寄存器访问操作语义表示,得到转换后的中断驱动型程序;
12.2)针对转换后的嵌入式中断驱动型程序,进行基于静态分析的寄存器访问冲突初步分析,得到潜在的寄存器访问冲突问题集合;
13.3)针对转换后的嵌入式中断驱动型程序,进行基于程序验证的寄存器访问冲突精确分析以对潜在的寄存器访问冲突问题集合筛选出真实的访问冲突,从而得到真实的寄存器访问冲突问题集合。
14.可选地,步骤1)中将所述代码中的寄存器访问操作转化为对寄存器数组变量某元素的读写操作时,包括将每一个寄存器读操作用一个三元组reg_op_r:=《addr,size,var》来表示,其中addr表示读的寄存器地址,size表示读的数据大小,var表示读出来的数据要
存入的程序变量;将每一个寄存器写操作用一个三元组reg_op_w:=《addr,size,data》来表示,其中addr表示写的寄存器地址,size表示写的数据大小,data表示写的数据内容。
15.可选地,步骤1)中引入的寄存器数组变量为字符型的寄存器数组变量reg_buf[regs_size],其中regs_size表示寄存器数组变量的寄存器空间大小;步骤1)中将所述代码中的寄存器访问操作转化为对寄存器数组变量某元素的读写操作包括:对每个寄存器读操作reg_op_r:=《addr,size,var》,将寄存器读操作reg_op_r:=《addr,size,var》转化为从寄存器数组变量reg_buf[regs_size]的第addr个元素所在地址中复制size个字节到var中;对每个寄存器写操作reg_op_w:=《addr,size,data),将寄存器写操作reg_op_w:=《addr,size,data》则转化为从data所在的地址中复制size个字节到寄存器数组变量reg_buf[regs_size]的第addr个元素所在地址中。
[0016]
可选地,步骤2)包括:
[0017]
2.1)通过函数展开提取出各任务流中对寄存器数组变量的读写访问操作,并初始化潜在的寄存器访问冲突问题集合为空;
[0018]
2.2)采用两两取出的方式,遍历取出包含寄存器数组变量读写访问操作的两个不同优先级的任务流构成任务流对;
[0019]
2.3)采用两两取出的方式,从当前任务流对中的两个不同优先级的任务流各遍历取出一个对寄存器数组变量的读写访问操作构成读写访问操作对,且针对遍历得到的每一个读写访问操作对判断是否可能构成数据访问冲突,若构成数据访问冲突则将当前读写访问操作对加入潜在的寄存器访问冲突问题集合中;
[0020]
2.4)判断任务流对是否遍历完毕,若尚未遍历完毕则跳转步骤2.2);否则,将潜在的寄存器访问冲突问题集合输出。
[0021]
可选地,步骤2.3)中判断是否可能构成数据访问冲突是指判断当前读写访问操作对中至少一个为写操作是否成立,若成立则判定当前读写访问操作对可能构成寄存器访问冲突,并将当前读写访问操作对加入潜在的寄存器访问冲突问题集合中。
[0022]
可选地,步骤3)包括:针对转换后的嵌入式中断驱动型程序,通过中断顺序化的方法将潜在的寄存器访问冲突集合中的每个潜在寄存器访问冲突的验证问题转化为一个串行程序的验证问题,得到串行转换的嵌入式中断驱动型程序,将串行转换的嵌入式中断驱动型程序输入程序验证工具进行验证以在潜在的寄存器访问冲突集合中筛选出真实的访问冲突,从而得到真实的寄存器访问冲突问题集合。
[0023]
可选地,所述通过中断顺序化的方法将潜在的寄存器访问冲突集合中的每个潜在寄存器访问冲突的验证问题转化为一个串行程序的验证问题时包括:将潜在的寄存器访问冲突集合中的每个潜在寄存器访问冲突的属于高优先级任务流t2的读写操作e2操作处,添加一条assert断言语句:assert(!((addr1≤addr2&&addr1 size1≥addr2)||(addr2≤addr1&&addr2 size2≥addr1))),使得将串行转换的嵌入式中断驱动型程序输入程序验证工具后,若触发assert断言语句并返回一条能到达读写操作e2的路径,则判定该潜在寄存器访问冲突的两个读写操作e1和e2在该执行路径中可以同时发生且可以访问同一个地址;引入一个整型的中断使能变量intenablelist,其中第i位的取值表示第i个中断服务程序的状态,称为第i个中断服务程序的使能标记,使能标记的取值可以为0或1,0表示该关闭状态,1表示打开状态;针对转换后的嵌入式中断驱动型程序,在每个中断服务程序的开始位
置都加上针对其使能标记的判断条件,若其使能标记为0,则不执行中断服务程序里面的内容,直接返回;然后在嵌入式中断驱动型程序中遇到中断开关函数时,若是打开第i个中断服务程序,则将中断使能变量intenablelist的第i位设为1;若是关闭第i个中断服务程序,则将中断使能变量intenablelist的第i位设为0,从而若一个中断服务程序被关闭,则其使能标记被设为0、且在执行相应的中断服务程序时将直接退出,而不会再执行中断服务程序中的语句;所述将串行转换的嵌入式中断驱动型程序输入程序验证工具进行验证时,所述程序验证工具将潜在的寄存器访问冲突集合中同时发生且可以访问同一个地址且对应的中断服务程序未被关闭的潜在的寄存器访问冲突作为筛选出的真实的访问冲突,从而得到真实的寄存器访问冲突问题集合。
[0024]
可选地,所述通过中断顺序化的方法将潜在的寄存器访问冲突集合中的每个潜在寄存器访问冲突的验证问题转化为一个串行程序的验证问题时包括:将潜在的寄存器访问冲突集合中的每个潜在寄存器访问冲突的属于高优先级任务流t2的读写操作e2操作处,添加一条assert断言语句:assert(false),使得将串行转换的嵌入式中断驱动型程序输入程序验证工具后,若触发assert断言语句并返回一条能到达读写操作e2的路径,则判定该潜在寄存器访问冲突的两个读写操作e1和e2在该执行路径中可以同时发生。
[0025]
此外,本发明还提供一种面向中断驱动型程序的寄存器访问冲突检测系统,包括相互连接的微处理器和存储器,该微处理器被编程或配置以执行所述面向中断驱动型程序的寄存器访问冲突检测方法的步骤。
[0026]
此外,本发明还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,该计算机程序用于被微处理器编程或配置以执行所述面向中断驱动型程序的寄存器访问冲突检测方法的步骤。
[0027]
和现有技术相比,本发明主要具有下述优点:本实施例面向中断驱动型程序的寄存器访问冲突检测方法首先将其中的寄存器访问操作转化为等价的对寄存器数组变量的访问操作,准确识别各任务流中对寄存器数组变量的读写访问操作,在不考虑程序执行条件以及寄存器访问地址的情况下,根据不同任务流的优先级以及数据访问冲突模式来匹配搜索程序中的潜在的寄存器访问冲突,最后对每一个潜在的寄存器访问冲突,通过程序验证的方法验证是否存在一条路径使得冲突中的两个访问操作同时发生且访问相同地址,从而能够寄存器访问冲突自动检测,并且能够实现对寄存器访问冲突的精确分析。
附图说明
[0028]
图1为本发明实施例方法的基本原理示意图。
[0029]
图2为本发明实施例步骤2)的实施流程示意图。
具体实施方式
[0030]
如图1所示,本实施例面向中断驱动型程序的寄存器访问冲突检测方法包括:
[0031]
1)针对给定含寄存器访问操作的嵌入式中断驱动型程序,在嵌入式中断驱动型程序的代码中引入寄存器数组变量,并将所述代码中的寄存器访问操作转化为对寄存器数组变量某元素的读写操作,从而完成基于寄存器数组变量的寄存器访问操作语义表示,得到转换后的中断驱动型程序;
[0032]
2)针对转换后的嵌入式中断驱动型程序,进行基于静态分析的寄存器访问冲突初步分析,得到潜在的寄存器访问冲突问题集合;
[0033]
3)针对转换后的嵌入式中断驱动型程序,进行基于程序验证的寄存器访问冲突精确分析以对潜在的寄存器访问冲突问题集合筛选出真实的访问冲突,从而得到真实的寄存器访问冲突问题集合。
[0034]
本实施例面向中断驱动型程序的寄存器访问冲突检测方法能够解决嵌入式中断驱动型程序中寄存器访问冲突的检测主要存在的挑战,能够在分析过程中表示寄存器操作访问的语义,判断不同寄存器操作访问的是否是同一地址以及准确考虑寄存器访问操作的执行条件,实现寄存器访问冲突自动检测。
[0035]
给定含寄存器访问操作的嵌入式中断驱动型程序,步骤1)阶段首先扫描与识别程序中的寄存器访问操作。寄存器访问操作通常包含两种类型,即寄存器读操作和寄存器写操作。寄存器读操作从寄存器中读出数据到程序变量中,寄存器写操作则将数据写入到寄存器的中。如果将寄存器看作一个共享的寄存器数组变量,则对寄存器中某地址的读写操作可看成是对该数组变量某元素的读写操作。依据该思路,在代码中引入寄存器数组变量,并将代码中的寄存器访问操作转化为对寄存器数组变量某元素的读写操作。通过该步骤后,得到包含寄存器数组变量读写操作的中断驱动型程序。
[0036]
下文给出了嵌入式程序中几种典型的寄存器访问操作方式。
[0037]
寄存器访问操作方式1:
[0038]
#defineira(*(volatile unsigned int*)0x23c4a872)
[0039]
ira==data;
[0040]
寄存器访问操作方式2:
[0041]
volatile unsigned int*pira=(unsigned int*)0x23c4a872;
[0042]
*pira=data;
[0043]
寄存器访问操作方式3:
[0044]
#defineulbase 0x23c4a872
[0045]
int offset=...;
[0046]
canregwrite(ulbase offset,data);
[0047]
其中,寄存器访问操作方式1和寄存器访问操作方式2为直接对寄存器地址0x23c4a872进行写操作,往该地址写入一个无符号整型(unsigned int)数据data。寄存器访问操作方式3为通过寄存器操作函数canregwrite()往基地址ulbase和偏移量offset构成的地址ulbase offset写入数据data。还有的直接对特殊功能寄存器进行操作,但其本质上都是对寄存器地址的访问操作。总结上述寄存器访问操作中可以看出,寄存器访问操作存在3个主要的问题。一是寄存器访问操作形式多样,需要能正确识别多种不同的寄存器操作方式;二是寄存器的访问操作地址可能不是一个常数,无法在静态分析中确认其具体的操作地址;三是寄存器访问操作的空间还跟往该地址读写的数据类型有关,读写一个整数数据将往该地址连续写入4个字节的数据。虽然寄存器操作的形式多样,但其本质上都是往寄存器空间某地址读写一定大小的数据。因此,本实施例步骤1)中将所述代码中的寄存器访问操作转化为对寄存器数组变量某元素的读写操作时,包括将每一个寄存器读操作用一个三元组reg_op_r:=《addr,size,var》来表示,其中addr表示读的寄存器地址,size表示
读的数据大小,var表示读出来的数据要存入的程序变量;将每一个寄存器写操作用一个三元组reg_op_w:=《addr,size,data》来表示,其中addr表示写的寄存器地址,size表示写的数据大小,data表示写的数据内容。
[0048]
现有的程序分析技术与工具主要针对标准c程序,尚不支持寄存器的访问操作。为实现寄存器访问冲突的检测,在嵌入式中断驱动型程序中引入寄存器数组变量,并将程序中的寄存器访问操作转化为对数组的读写操作。本实施例中,步骤1)中引入的寄存器数组变量为字符型的寄存器数组变量reg_buf[regs_size],其中regs_size表示寄存器数组变量的寄存器空间大小;步骤1)中将所述代码中的寄存器访问操作转化为对寄存器数组变量某元素的读写操作包括:对每个寄存器读操作reg_op_r:=《addr,size,var》,将寄存器读操作reg_op_r:=《addr,size,var》转化为从寄存器数组变量reg_buf[regs_size]的第addr个元素所在地址中复制size个字节到var中;对每个寄存器写操作reg_op_w:=《addr,size,data》,将寄存器写操作reg_op_w:=《addr,size,data》则转化为从data所在的地址中复制size个字节到寄存器数组变量reg_buf[regs_size]的第addr个元素所在地址中,通过这种方式,在保持寄存器访问操作语义的情况,将寄存器访问操作转化为等价的共享数组变量操作。本实施例中,字符型的寄存器数组变量reg_buf[regs_size]的定义方式如下:
[0049]
char_reg_buf[regs_size]
[0050]
通过定义共享的寄存器数组变量reg_buf[regs_size]来模拟寄存器的存储空间。寄存器访问操作到寄存器数组变量的访问操作转化规则可表示为:
[0051][0052]
其中,memcpy为内存复制操作,后面的括号内均为memcpy的参数。
[0053]
通过步骤1)将对寄存器访问冲突的分析转化为了对寄存器数组变量的访问冲突分析后,本实施例中在步骤2)阶段则将采取静态分析的方法分析针对寄存器数组变量的访问冲突。首先对整个中断程序进行语法语义分析,通过函数展开等方法准确识别程序各任务流对寄存器数组变量的读写访问操作。然后根据不同任务流的优先级以及数据访问冲突模式来匹配搜索程序中的寄存器访问冲突。考虑到在对寄存器进行读写操作时其读写地址可以是变量或表达式,无法在静态分析时确定具体的读写地址,因此该阶段把不同优先级任务流中对同一数组变量的访问操作都当作寄存器访问冲突,而不考虑其具体的访问地址、以及程序具体的执行条件。将在该阶段分析得到的访问冲突称为潜在的寄存器访问冲突。理论上,该阶段能分析出所有可能的寄存器访问冲突。
[0054]
寄存器访问冲突是指在某低优先级任务流对某寄存器地址进行读写操作时,一个高优先级任务流发生,从而打断低优先级任务流的执行,同时在该高优先级任务流中也存在对相同寄存器地址的读写操作,且两个寄存器操作中至少有一个是写操作。在步骤1)中将寄存器访问操作转化为了对寄存器数组变量的操作,接下来的任务是需要分析程序中对寄存器数组变量的访问冲突问题。本实施例中在步骤2)阶段则将采取静态分析的方法分析针对寄存器数组变量的访问冲突。参见图2,本实施例中步骤2)包括:
[0055]
2.1)通过函数展开提取出各任务流中对寄存器数组变量的读写访问操作,并初始
化潜在的寄存器访问冲突问题集合为空;
[0056]
2.2)采用两两取出的方式,遍历取出包含寄存器数组变量读写访问操作的两个不同优先级的任务流构成任务流对;
[0057]
2.3)采用两两取出的方式,从当前任务流对中的两个不同优先级的任务流各遍历取出一个对寄存器数组变量的读写访问操作构成读写访问操作对,且针对遍历得到的每一个读写访问操作对判断是否可能构成数据访问冲突,若构成数据访问冲突则将当前读写访问操作对加入潜在的寄存器访问冲突问题集合中;
[0058]
2.4)判断任务流对是否遍历完毕,若尚未遍历完毕则跳转步骤2.2);否则,将潜在的寄存器访问冲突问题集合输出。
[0059]
本实施例方法中通过函数展开,提取出各任务流中对寄存器数组变量的读写访问操作。由于寄存器访问冲突发生在两个具有不同优先级的任务流之间,因此两两取出包含寄存器数组变量读写访问操作的任务流进行分析。对每个这样的任务流对,从两个任务流中各取出一个对寄存器数组变量的读写访问操作,若其中至少一个为写操作,则认为这两者之间可能构成寄存器访问冲突,因此将其加入潜在寄存器访问冲突集合中。通过这种方式,可以分析得到所有可能的寄存器访问冲突。
[0060]
依据寄存器访问冲突的定义,本实施例步骤2.3)中判断是否可能构成数据访问冲突是指判断当前读写访问操作对中至少一个为写操作是否成立,若成立则判定当前读写访问操作对可能构成寄存器访问冲突,并将当前读写访问操作对加入潜在的寄存器访问冲突问题集合中。
[0061]
在步骤2)阶段中,由于没有对程序的具体语义进行分析,因此无法判断不同的寄存器访问操作读写的是否同一地址,也无法判断是否存在一条真实的执行路径使得该访问冲突实际发生。针对该问题,步骤2)阶段不考虑寄存器的访问地址,也不考虑其执行条件,只要是对寄存器数组变量的读写访问操作,就将其报出来,因此在分析得到的潜在寄存器访问冲突集合中可能存在大量的误报。需要进一步通过步骤3)筛选和优化。
[0062]
在步骤2)阶段的寄存器访问冲突分析过程中,由于没有考虑具体的寄存器访问地址,以及程序具体的执行条件,因此报出来的潜在寄存器访问冲突中存在大量的误报。程序验证是对程序进行精确分析的一种有效方法。步骤3)阶段采取程序验证的方式,针对每一个潜在的寄存器访问冲突问题,将该访问冲突中不同寄存器访问操作访问的是否同一地址、以及是否存在可行路径使得该访问冲突真实发生等问题,转化为一个串行程序的验证问题。然后再通过现有的程序验证方法和工具进行验证。若能找到一条执行路径,使得在该路径中不同操作访问的是同一地址,且冲突可真实发生,则该潜在的访问冲突问题是一个真实的寄存器访问冲突。否则,该潜在的访问冲突问题是一个误报。具体地,本实施例中的步骤3)包括:针对转换后的嵌入式中断驱动型程序,通过中断顺序化的方法将潜在的寄存器访问冲突集合中的每个潜在寄存器访问冲突的验证问题转化为一个串行程序的验证问题,得到串行转换的嵌入式中断驱动型程序,将串行转换的嵌入式中断驱动型程序输入程序验证工具进行验证以在潜在的寄存器访问冲突集合中筛选出真实的访问冲突,从而得到真实的寄存器访问冲突问题集合。在前面的分析中,由于无法精确考虑程序的语义,分析结果存在大量误报。程序验证是当前对程序代码语义进行精确分析的一种有效手段,可以基于程序验证的方法和技术实现寄存器访问冲突的精确分析。目前的程序验证方法和技术主
要对串行程序进行分析,可以通过中断顺序化的方法将每个潜在寄存器访问冲突的验证问题转化为一个串行程序的验证问题。
[0063]
本实施例中,通过中断顺序化的方法将潜在的寄存器访问冲突集合中的每个潜在寄存器访问冲突的验证问题转化为一个串行程序的验证问题时包括:
[0064]
(1)、判断不同操作是否可能同时发生。
[0065]
将潜在的寄存器访问冲突集合中的每个潜在寄存器访问冲突的属于高优先级任务流t2的读写操作e2操作处,添加一条assert断言语句:assert(false),使得将串行转换的嵌入式中断驱动型程序输入程序验证工具后,若触发assert断言语句并返回一条能到达读写操作e2的路径,则判定该潜在寄存器访问冲突的两个读写操作e1和e2在该执行路径中可以同时发生。假设某潜在寄存器访问冲突中导致冲突的两个读写操作分别为e1和e2,其中e1属于低优先级任务流t1,e2属于高优先级任务流t2,且e1和e2中至少有一个是写操作。所谓的e1和e2产生冲突是指:存在一条真实执行路径使得当t1执行到e1时,t2发生,且在t2中会执行到e2。为验证是否存在一条这样的路径,将高优先级任务流t2所对应的中断服务程序插入到t1的e1操作处,使得当t1执行到e1时,t2发生。为验证在t2中是否会执行到e2,在e2操作处,添加一条assert断言语句assert(false)。在程序验证时,若存在一条真实路径到达e2处,则会触发该断言语句,并返回一条能到达e2的路径。由于e2在该路径中发生了,所以t2在该路径中定然执行了。又因为t2是在执行到e1的时候被调用的,因此e1在该路径中也定然会发生。由此就找到了一条e1和e2能同时发生的路径,说明两个读写操作e1和e2在该执行路径中可以同时发生。
[0066]
(2)判断不同操作是否有访问同一地址。
[0067]
对每个寄存器数组变量_reg_buf的每个读写访问操作,都涉及到一个访问地址addr,以及一个读写数据的大小size。假设发生寄存器访问冲突的两个读写操作分别是e1:=《addr1,size1,var1》和e2:=《addr2,size2,var2》,其中e1属于低优先级任务流,e2属于高优先级任务流,e1的访问地址和读写数据大小分别为addr1和size1,e2的访问地址和读写数据大小分别为addr2和size2。若addr1≤addr2,则e1和e2有访问同一地址当且仅当addr1 size1≥addr2;若addr2≤addr1,则e1和e2有访问同一地址当且仅当addr2 size2≥addr1。因此,为在程序验证中验证一个潜在寄存器访问冲突的两个读写操作e1和e2是否有访问同一地址:本实施例中将潜在的寄存器访问冲突集合中的每个潜在寄存器访问冲突的属于高优先级任务流t2的读写操作e2操作处,添加一条assert断言语句:
[0068]
assert(!((addr1≤addr2&&addr1 size1≥addr2)||(addr2≤addr1&&addr2 size2≥addr1))),
[0069]
使得将串行转换的嵌入式中断驱动型程序输入程序验证工具后,若触发assert断言语句并返回一条能到达读写操作e2的路径,则判定该潜在寄存器访问冲突的两个读写操作e1和e2在该执行路径中可以同时发生且可以访问同一个地址;最简单的,若addr1与addr2相等,则该断言肯定不成立。加上该断言后,若该断言被触发,则该执行路径定然会执行到e2处,因此前面的assert(false)断言就不再需要了,可以将其删除。
[0070]
(3)中断开关语义的表示。
[0071]
在嵌入式驱动型程序中,开发人员可以通过中断开关函数来打开/关闭中断服务程序。在一个中断服务程序被关闭期间,该中断服务程序不会发生,它里面的寄存器访问操
作也不会与其他任务流的寄存器访问操作发生冲突。为表达该语义,本实施例引入一个整型的中断使能变量intenablelist,其中第i位的取值表示第i个中断服务程序的状态,称为第i个中断服务程序的使能标记,使能标记的取值可以为0或1,0表示该关闭状态,1表示打开状态;针对转换后的嵌入式中断驱动型程序,在每个中断服务程序的开始位置都加上针对其使能标记的判断条件,若其使能标记为0,则不执行中断服务程序里面的内容,直接返回;对第i个中断服务程序inthandle添加使能标记判断后的函数示例如下:
[0072][0073][0074]
然后在嵌入式中断驱动型程序中遇到中断开关函数时,若是打开第i个中断服务程序,则将中断使能变量intenablelist的第i位设为1;若是关闭第i个中断服务程序,则将中断使能变量intenablelist的第i位设为0,从而若一个中断服务程序被关闭,则其使能标记被设为0、且在执行相应的中断服务程序时将直接退出,而不会再执行中断服务程序中的语句,从而实现中断开关操作的语义;将串行转换的嵌入式中断驱动型程序输入程序验证工具进行验证时,所述程序验证工具将潜在的寄存器访问冲突集合中同时发生且可以访问同一个地址且对应的中断服务程序未被关闭的潜在的寄存器访问冲突作为筛选出的真实的访问冲突,从而得到真实的寄存器访问冲突问题集合。
[0075]
通过步骤3),可将一个潜在寄存器访问冲突的精确分析问题转化为了一个串行程序的验证问题,其中精确考虑了不同读写操作的执行条件、不同读写操作是否有访问同一地址、以及嵌入式程序中的中断开关语义。然后将该串行程序交给现有的程序验证工具进行验证,若能找到一条满足上述所有条件的执行路径,则说明该潜在的寄存器访问冲突是一个真实的访问冲突,从而实现寄存器访问冲突的精确分析。
[0076]
综上所述,本实施例可以实现嵌入式中断驱动型程序中寄存器访问冲突的精确检测。首先,针对现有程序分析和验证工具不支持寄存器访问分析的问题,本实施例将程序中的寄存器访问操作转化为等价的对寄存器数组变量的访问操作。其次,针对静态分析方法难以精确考虑程序执行条件,程序验证方法又难以刻画中断驱动型程序语义,同时还需要精确考虑寄存器操作的访问地址和中断开关语义等问题,本实施例将静态分析与程序验证结合起来,先通过静态分析方法初步分析得到所有可能的寄存器访问冲突,然后再通过程序验证对每个潜在的寄存器访问冲突进行精确验证,在验证中精确考虑程序执行条件、寄存器操作的访问地址、以及中断开关语义等问题。最终针对给定待分析的嵌入式中断驱动型程序以及实现了本发明方法的工具,用工具对待分析的程序进行分析,工具将自动完成寄存器访问操作到寄存器数组变量访问操作的转换、基于静态分析的寄存器访问冲突初步分析、以及基于程序验证的寄存器访问冲突精确分析,并将分析得到的潜在寄存器访问冲突集合以及通过验证的寄存器访问冲突集合反馈给用户。简而言之,本实施例方法包括三
个主要步骤:基于寄存器数组变量的寄存器访问操作语义表示、基于静态分析的寄存器访问冲突初步分析、以及基于程序验证的寄存器访问冲突精确分析。其中首次提出了寄存器访问冲突检测方法的整体框架、以及基于寄存器数组变量的寄存器访问操作语义表示;能够首次将静态分析和程序验证应用到对寄存器访问冲突的检测中,包括在程序验证中判断不同寄存器是否访问相同地址、以及中断开关的语义表示方法等。本实施例给出了在程序验证中判断不同操作是否可能同时发生、判断不同操作是否有访问同一地址、中断开关语义的表示等问题的具体解决方案,从而实现了对嵌入式中断驱动型程序中寄存器访问冲突的精确分析。
[0077]
此外,本实施例还提供一种面向中断驱动型程序的寄存器访问冲突检测系统,包括相互连接的微处理器和存储器,该微处理器被编程或配置以执行前文所述面向中断驱动型程序的寄存器访问冲突检测方法的步骤。
[0078]
此外,本实施例还提供一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序,该计算机程序用于被微处理器编程或配置以执行前文所述面向中断驱动型程序的寄存器访问冲突检测方法的步骤。
[0079]
本领域内的技术人员应明白,本技术的实施例可提供为方法、系统、或计算机程序产品。因此,本技术可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本技术可采用在一个或多个其中包含有计算机可用程序代码的计算机可读存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。本技术是参照根据本技术实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
[0080]
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献