具有指令签名支持的分布式编译处理的制作方法

文档序号:6373395阅读:163来源:国知局
专利名称:具有指令签名支持的分布式编译处理的制作方法
具有指令签名支持的分布式编译处理技术领域
本申请涉及用于向编译器提供指令签名支持(instruction signature support) 的编译模块,更具体地,涉及在高级语言源代码的编译处理期间处理指令签名相关的信息。
背景技术
可编程计算单元通常被设计为处理指令序列,以执行特定任务。指令序列也可称 为程序代码。程序代码通常存储在存储器中,并在运行时被提供至计算单元。鉴于信息安 全,可能期望在指令存储于存储器中或从存储器传输至计算单元时保护指令不被分析。另 一方面,如果到达计算单元的指令不同于所需的指令,则可能会在程序代码执行期间发生 错误。由计算单元实际处理的指令和所需指令之间的差异可能有随机的原因,或可能由入 侵者故意引起。在任何情况下,都应及早检测到由改变的指令所造成的错误。
控制流检查方法可用于检测由计算单元实际处理的指令和所需指令之间的这种 差异。基于指令签名的控制流检查方法的基本原则是在程序运行期间在校验和(即,签名) 中计算程序运行时所执行的指令总数,并在预定的程序点验证该校验和是否匹配参考值。 校验和与参考值之间的差表明实际程序执行和预计程序执行之间的可能偏差。
当创建或编译支持控制流检查的程序时,最常见的控制流检测方法需要所谓的更 新值插入程序中的特定点。例如,如果程序跳变或分支点发生,且两个不同的路径(在不同 指令序列被执行进而导致不同签名的意义上不同)再次合并,由路径执行产生的签名需要 在合并点处是一致的。为此,更新的值插入至少一个路径。分支发生在条件(直接)跳变、间 接跳变、直接和间接函数调用处。此外,在执行将运行期间计算的签名和参考值进行比较的 程序点处需要参考值。这些参考值也需要在适当的程序点处被引入程序。发明内容
本文所述的实施方式提供了一种用于向编译器提供指令签名支持的编译模块 (compiler module)。该编译模块包括语言结构识别器,被配置为在供应至编译器的高级 语言源代码中识别指令签名相关的语言结构;以及占位符插入组件,被配置为与编译器 (compiler)交互,从而将基于指令签名相关的语言结构的至少一个指令签名相关的占位符 插入由编译器基于高级语言源代码而处理的编译代码中。
本文所述的其它实施方式提供了一种指令签名生成器,包括用于编译代码的输 入、占位符识别器、签名计算器和占位符替换器。占位符识别器被配置为在编译代码中识别 指令签名相关的占位符。签名计算器被配置为确定针对编译代码中发生所述指令签名相关 的占位符处的程序点的签名值。占位符替换器被配置为基于程序点处的签名值来插入编译 代码段。
本文所述的其它实施方式提供了一种编译器接口数据结构,其包括编译指令,其 中至少有一个是编译指令为指令签名相关的占位符。
本文所述的其它实施方式提供了一种在高级语言源代码的编译处理中处理指令签名相关信息的方法,该方法包括在高级语言源代码中识别指令签名相关的语言结构; 与编译处理交互,以便将基于指令签名相关的语言结构的至少一个指令签名相关的占位符插入由编译处理基于高级语言源代码所处理的编译代码中。
本文所述的其它实施方式提供了一种计算机可读数字存储介质,具有程序代码的计算机程序存储于其上,当在计算机上运行时该程序代码用于执行在高级语言源代码的编译处理期间用于处理指令签名相关的信息的方法,所述方法包括在高级语言源代码中识别指令签名相关的语言结构;与编译处理交互,以便将基于指令签名相关的语言结构的至少一个指令签名相关的占位符插入以高级语言源代码为基础通过编译处理所处理的编译代码中。
本文所述的其它实施方式提供了一种产生指令签名的方法,该方法包括确定指令签名相关的占位符应插入编译代码中何处程序位置;确定针对编译代码中发生指令签名相关的占位符处的程序位置的签名值,并在该程序位置处插入编译代码段(其在所确定的签名值的基础上隐式或显式地产生更新)。
本领域的技术人员在阅读了以下详细描述并查看附图之后将认识其它的特征和优点。


附图的元件不一定彼此成比例。相同的参考符号表示相应的类似部件。各个所示实施方式的特征可组合,除非它们互相排斥。实施方式描述于附图中,且详细描述如下。
图1示出包括条件分支、默认路径、以及非默认路径的指令序列的示意性流程图。
图2示出提供指令签名支持的编译处理的示意性流程图。
图3示出编译器以及用于对编译器提供指令签名支持的编译模块的示意性框图。
图4说明用于指令签名支持的编译模块和指令签名生成器的效果。
图5示出指令签名生成器的示意性框图。
图6示出用于处理指令签名相关的信息的方法的示意性流程图。
具体实施方式
指令流签名通常会提供程序代码的比较强的完整性保护。如图1中可以看出,带有条件分支指令(例如,指令i2)的每个代码序列具有“默认路径”,在图1中经由指令i3和 i4至指令i5处的合并点。对于该“默认路径”,签名S5由静态代码分析器计算。为了处理 “非默认路径”(例如,从指令i2直接到指令i5),在每一个条件分支处执行签名更新,以便该签名与好像进行了默认路径的签名一样。图1中说明了这一点,箭头标记的“更新SI+Λ” 是指按照与在进行默认路径的情况下由指令i3和i4修改的SI相同的方式来修改SI。如果默认路径是唯一路径而从开始到结束没有进行更新,则可以由用户或程序员隐式定义哪个路径是默认路径。一般来说,任何路径都可以是默认路径。
实际的程序通常包含带有更新值或参考值的多个程序点。此处,更新值和参考值统称为签名值。签名值插入的位置或程序点被称为签名位置。缩写IS S代表指令流签名 (Instruction Stream Signature)。
创建控制流保护代码的一个方法是程序员在他知道的签名位置处将签名值手动插入代码的选定部分。为此,程序员必须自己确定签名值和签名位置。然而,许多编译器和 连接器执行优化步骤和程序代码内的指令序列的修改,这对于程序员是很难预料的。
如果程序员自己确定签名值和签名位置,则可能会引起复杂的、容易出错的、重复 的工作流程并会根据能够被插入的签名值的等级进行限制。可能出现的一些限制是
-当以高级语言插入签名值时,程序员可能通常仅使用编程语言的语言结构的子 集,用于所有可能的签名值插入。例如,对于在高级编程语言中常用的特定语言结构,并非 所有的签名位置都可从源代码级访问。以下形式的条件分支
a) if X>0and x〈lthen
1.指令序列A
b) end if
1.指令序列B
-可能会经常导致两个条件跳变,因为在第一指令中检查两个条件,以到达指令序 列A。然而,好的编译器会避免检查全部这两个条件,以便导致仅一个跳变,因为这会导致平 均50%以上更慢的代码。因此,两个更新值须被插入两个非默认路径。然而,这在源代码级 上是不可能的,因此必须使用另一个程序结构。
-对于已经以高级语言写入的代码并不总是能够以汇编语言级插入签名值。许多 编译器直接生成二进制代码(机器语言代码),且汇编级根本不可用。
-处于二进制代码级(机器代码级)的签名值的插入会导致指令在程序代码中的偏 移,因此必须相应地更正跳变目的地。这个处理非常复杂,原因在于所有的跳变起点和跳变 目的地都必须进行分析。此外,甚至也可能是跳变或分支指令被取代,原因在于跳变距离偏 移如此多,使得它们超出了二进制代码中所提供的跳变指令范围。
-在每级上,程序员都可能在找签名位置时出错(例如,不慎遗漏签名位置)和/或 错误计算签名值。
由编译器和/或连接器执行的优化可迫使程序员的进一步限制和/或努力。特别 地,由编译器和连接器进行的代码修改可处理如下
-程序员首先通过编译器和连接器创建二进制代码。
-程序员选择对于编译器和连接器所造成的修改是透明的指令签名方法。因此,大 大地降低了签名的效果,原因在于指令签名方法对于编译器和连接器修改是透明的。
根据本文所述实施方式的编译模块、指令签名生成器、编译器接口数据结构、用于 在高级语言源代码编译处理期间处理指令签名相关的信息的方法,以及相应的计算机可读 数字存储介质解决了现有指令签名方法的缺点。根据本文所述的实施方式,在编译步骤和 随后的签名生成步骤期间所执行的措施以有效方式组合。因此,本文所述的实施方式能够 实现对普通编程语言的完全支持,使得i)编程语言的语法可用于控制流保护程序和程序部 分的全部范围,以及ii)由(例如)未受保护的程序部分生成控制流保护程序或程序部分能 够以基本上完全自动的方式执行。因此,本文所述的实施方式涉及具有指令签名支持的分 布式编译处理和/或具有指令流控制的(计算机)程序的生成。
本文所述的实施方式便于签名值插入和计算的自动化,以及在两个主要阶段(基 本是占位符的插入和计算)中处理的分离。本文所述的实施方式还涉及两个步骤之间的接 口。两个主要阶段由单独的工具、编译模块(“签名编译器”)和指令签名生成器执行。
程序员可经由提供至编译器的高级语言源代码影响指令签名支持的应用。
例如,在要被保护的代码的开始处,用户可通过函数FCT_ISS_Start()使能ISS (指令流签名)。在要被保护的代码序列(或受保护的程序代码段)结束时,函数FCT_ISS_ Stop O检查签名并再次关闭ISS。用于FCT_ISS_Start()的常量参数ref在稍后的时间 由签名指令生成器计算,并由静态代码检查器(或签名指令生成器)在包括编译代码的文件 (.elf文件)中补丁。在函数ISS_UPDATE最开始处,占位符必须插入常数值被计算出并且 由静态代码检查器补丁的地方。在每个函数调用、直接和间接调用后,额外的ISS_UPDATE 占位符必须插入常数被计算出和补丁的地方,以便在下一个FCT_ISS_Check()或FCT_ISS_ STOPO处得到正确值。
通过函数FCT_ISS_Status(),用户可以检查ISS代码序列是否已被正确地执行。 在运行ISS代码序列期间,用户可以经由FCT_ISS_Check()在安全关键点处插入额外的检 查点,在此处常量参数ref被计算和补丁,以便预计值位于处理器或签名模块的专用寄存 器(ISS_DATA寄存器)中,前提条件是指令的执行并未包含错误。
图2示出在工具流程(即,用于将高级语言源代码转换成能够(直接)由处理器执行 的二进制代码的编译环境)中的ISS集成。ISS主要支持两部分
-用于ISS_UPDATE占位符插入以及将一些信息转发到静态代码检查器的编译器 支持(例如,以内部或外部编译模块的形式);用于识别应该是ISS保护的程序区域(例如,函 数)的编译器支持;用于识别特定的ISS相关的函数(诸如,FCT_ISS_Check())的编译器支 持。由指令签名支持工具所扩展的编译器在本文中也被称为“签名编译器”。
-指令签名生成器或静态代码检查器,其是进行签名计算以及通过签名值替换 ISS_UPDATE占位符的后处理工具。
为了提供两部分交互的一般理解,签名编译器和指令签名生成器的主要功能简要 描述如下。
签名编译器通常实现以下方面
-在签名位置处插入针对签名值的占位符。基于一组规则和源代码级编译指示 (pragma)和/或关键字来确定位置。该组规则将在下面更详细地解释。
-控制信息的可选生成,被称为“签名控制信息”
-称为“签名库函数”的软件库的提供,在控制信息的基础上选择其元素。
指令签名生成器通常实现以下方面
-读取签名编译器产生的编译代码以及(如果适用)签名控制信息;
-基于基本块和默认路径分析计算签名值;以及
-在相应占位符的位置处插入计算出的签名值。“签名插入”的概念一般是指在占 位符的位置处插入一个或多个机器指令,其包含有关签名值的信息,且可选地,关于处理签 名值(例如,更新签名)所需指令的信息。
在图2中,一个或多个源文件202 (例如,以高级C语言,由文件扩展名“C”表示) 提供至编译器210。编译器210包括编译模块212 (“ISS扩展”),其将指令签名的特定处 理的支持添加至编译器210。如图2所示,编译模块212可与编译器210集成。或者,编译 模块212可为例如以动态链接库、动态共享对象、添加、插件或软件扩展形式的外部模块。 编译器210在源文件202的基础上产生具有文件扩展名ο”的对象文件222。此外,编译器210可产生列表文件214,主要用于信息和/或调试的目的。对象文件222内的编制代 码通常在多个程序点处包括数个指令签名相关的占位符。已经由编译模块212将指令签名 相关的占位符添加至经编译的代码,以便保留针对可用于今后签名值插入的存储空间。编 译模块212可基本上与编译器210编译源代码同时地执行占位符插入。以此方式,编译器 210在编译处理的早期阶段知晓插入的占位符,并可能在继续进行编译处理时(特别是在计 算分支或跳变目的地时)考虑有关占位符的信息、它们的位置和它们的大小。编译模块212 可监控编译处理的进程,即,源代码202内的哪个语言结构目前由编译器210处理。签名相 关的占位符的插入保留给予编译器210的原始高级语言代码的逻辑功能。编译器210意识 到优化阶段不会以破坏ISS的错误检查能力的方式来修改或移动插入的占位符,例如通过 在循环不变式优化期间在循环外部提升(hoi St )签名更新。
经编译的代码可为机器语言代码。占位符插入组件可以被配置为选择至少一个指 令签名相关的占位符,以便至少一个指令签名相关的占位符的大小等于最终在经编译的代 码中取代至少一个指令签名相关的占位符的机器语言指令的序列或机器语言指令的大小。
作为对于结合编译器210以高级语言(诸如,C)写入的源文件的替代,程序员也可 以选择以汇编语言编写源文件205,然后其可由汇编器216处理。汇编器216还生成对象 文件226和可选的列表文件218。在图2中,汇编器216并未包括向汇编器216添加指令 签名特定处理支持的模块。因此,程序员自己将任何指令签名相关的占位符添加到汇编器 216中,例如经由在其发生的程序点处写入预定二进制代码的宏。虽然图2中未示出,但是 汇编器216通常会包括提供类似编译模块212功能的汇编模块或与其交互。
根据是否旨在通过对象文件222生成可执行程序或软件库文件,对象文件222被 馈送至库管理器230或连接器/定位器240。以类似的方式,由汇编器216创建的对象文 件226可被馈送至库管理器230或连接器/定位器240。此外,一个或多个库文件可供应 至库管理器230或连接器/定位器240。库管理器230输出库文件232。连接器/定位器 240输出ELF (可执行和可链接文件)图像246。连接器/定位器240可使用分散文件244 作为另一个输入,用于链接和定位处理(其在加载所产生的ELF图像246时,基本上确定了 处理器的存储器布局是如何组织的)。连接器/定位器240包括能够产生可选的映射文件 247的指令流签名(ISS)扩展242。
除了分别位于编译器210和连接器/定位器242中的指令签名相关的扩展212和 242之外,直至图2中的水平虚线表示的点,编译和链接环境大致等于标准构建流。
ELF图像246仍然包含由编译模块212插入的指令签名相关的占位符。为了将这 些占位符转换成针对处理器(程序会在其上被最终运行)来说有用的指令或数据,指令签名 生成器250处理ELF图像246,以创建经修改的ELF图像256。在经修改的ELF图像256中, 指令签名相关的占位符已被对应于占位符发生的程序点(即,签名位置)的签名值取代。指 令签名生成器250 (也称为“(静态)代码检查器”)在经编译的代码中搜索占位符。此外,指 令签名生成器250可执行基本块分析和默认路径分析,从而找到经由哪个指令序列可以到 达占位符的程序点,作为确定该程序点处的签名值。或者,指令签名生成器250可以从(例 如)编译器210或连接器/定位器240中以列表文件214或映射文件247的形式接收相应 的基本块和默认路径信息。以基本块和默认路径分析或信息和初始签名值为基础,指令签 名生成器250然后可在占位符发生的程序点处确定参考签名。指令签名生成器250可以按照当运行程序时可被执行的顺序从占位符到占位符来“艰难地通过(wade through)^LF图像246,以便找到在进行默认路径或非默认路径(如果存在)的情况下在两个占位符程序点之间执行哪个指令。在指令签名生成器250输出的ELF图像256中,占位符已被指令签名生成器250计算的签名值替换。
经修改的ELF图像256输入至后定位器260,该后定位器创建物理ELF图像266和 /或十六进制文件267。此外,后定位器260可使用一个或多个额外的ELF图像262、衍生配置(derivative configuration) 263和可选的项目配置264。可选地,后定位器260可输出映射文件265。
物理ELF图像266或十六进制文件267可在支持指令签名跟踪的处理器270上执行。或者,物理ELF图像266或十六进制文件267可在模拟器(未示出)上执行。
签名编译器的基本功能已经在上面进行简要地描述。更详细地,签名编译器执行标准编译器的典型动作,以本文所述的实施方式的特定动作来补充。在解析和句法/语法分析的动作期间,执行确认特定编译指示和关键字的额外动作。可能的关键字的例子为
ISS_0N (ISS 段开始)
ISS_0FF (ISS 段结束)
ISS_START (激活ISS,即,使处理器ISS模块开始在签名寄存器中计算所执行的指令的总和)
ISS_ST0P (禁用 ISS)
ISS_CHECK (ISS 签名检查)
ISS_STATUS (ISS—致性检查)
ISS_SUSPEND (ISS挂起,例如,在函数调用的情况下)
ISS_RESUME (ISS恢复,例如,当程序从对于调用函数进行调用的函数返回)
ISS_SUSPENDRESTART (ISS 中断处理)
编译指示或关键字可以作为库函数而解决。因此,可提供以下库函数用于
void FCT_ISS_Start (const ref)
-该函数将参数ref的值加载到ISS_DATA寄存器。因此,对于ISS_DATA寄存器的写入,将签名的当前值设置为新的自变量ref,从而覆写以前的值。相反,对ISS_UPDATE 寄存器的写入执行当前签名的增量变化。随后,该函数使能指令流签名跟踪(例如,通过在 ISS_CTRL寄存器中设置相应位)。
void FCT_lSS_StopO
-该函数关闭指令流签名跟踪。
void FCT_ISS_Check (const ref)
-在程序运行期间,该函数检查存储于ISS_DATA寄存器中的当前1BS_DATA值为预计值,即,等于参数ref值(其已经在程序编译期间由指令签名生成器确定并插入适当的点处),分别输入值的参考表中。如果当前ISS_DATA值偏离常量参数ref的值,则触发安全动作。例如,指令签名生成器可以将常量参数ref的值插入使处理器跳变至函数FCT_ISS_ Check的第一指令的跳变指令的点的点上游处,以便插入的值用作函数的参数ref。例如, 如果通过定义将函数参数置于处理器的特定寄存器中,则足以在跳变指令之前将指令签名生成器确定的值写入该寄存器中。
void FCT_ISS_Status ()
-该函数检查寄存器ISS_DATA的内容。在检测到不一致的情况下,触发安全动作。 该函数通常用于ISS关闭的区域,并检查ISS_DATA寄存器的值是否匹配魔术常量值(magic constant value)。以这种方式,可以检查是否已经错误地留下了 ISS保护的区域,例如,跳 过ISS_ST0P()函数。请注意,ISS_ST0P()留下具有魔术常量值的ISS-on域名。
int FCT_ISS_SuspendO
-该函数保存ISS_DATA和ISS_STATUS寄存器的当前内容,例如作为工作存储器中 的局部变量。更具体地,该函数检索ISS_DATA和ISS_STATUS寄存器的当前值,作为然后可 以保存在工作存储器中的单一整数值(其他格式也是可能的)。随后,关闭指令流签名跟踪。
int FCT_ISS_SuspendRestart (const ref)
-该函数类似于先前的函数FCT_ISS_Suspend()。因此,它也可以保存ISS_DATA 和ISS_STATUS寄存器的当前内容,并开启指令流签名跟踪。此外,参数ref的值作为更新 值加载在当前ISS_DATA值的顶部。
void FCT_ISS_Resume (save)
-该函数与以前介绍的两个函数FCT_ISS_Suspend和FCT_ISS_Suspend相对。函 数FCT_ISS_Resume关闭指令流签名跟踪并(例如)根据先前存储在工作存储器中的变量来 恢复ISS_DATA和ISS_CTRL寄存器。例如存储在工作存储器中的ISS_DATA和ISS_CTRL寄 存器的值以单一参数save的形式被输入该函数。
这些库函数提供指令流签名支持所需的函数。此外,大多数程序使用针对常用函 数的(标准)库。这些标准库通常不提供指令流签名跟踪,从而在一个标准库中未受保护的 函数调用可能会导致漏检错误,并因此导致安全漏洞。因此,如果需要更完整的覆盖(包括 运行库调用),则按照指令流签名支持的第二组运行库是必要的。通过由签名编译器(编译 器210和编译模块212)和/或指令签名生成器250产生的签名控制信息来控制结合器/ 连接器(binder/linker),其中结合器/连接器在指令签名保护的代码段内使用指令签名 保护的库函数。特别地,语言结构识别器被配置为识别对其使能指令签名支持的受保护的 程序代码段。编译模块还包括库调用信息收集器,其被配置为收集在受保护的程序代码段 中发生的与软件库调用相关的库调用信息,并将该库调用信息提供给随后的连接处理期间 使用。
编译器210通常执行基本块分析。优选地,编译器210也执行默认的路径分 析。作为额外的动作,编译模块212可根据针对以下各项的规则插入隐式签名指令a) do-whiIe-1oop 结构;b) while-do-loop 结构;c) if-then-else 结构;d)各种多转换结构 (multiple switch construct)。在标记为指令签名保护的代码段(例如,关键字ISS_0N和 ISS_0FF之间的代码段)中进行这些插入。语言结构识别器213可被配置为识别在对其使 能指令签名支持的高级语言源代码中受保护的程序代码段的开始和结束。占位符插入组件 可被配置为使用相应的保护段识别的结果,以便激活在受保护的程序代码段内插入至少一 个指令签名相关的占位符,并禁用在非保护的程序代码段内的占位符插入。
由编译模块212 (或一旦由编译模块212进行相应的邀请之后由编译器210)进行 的其它额外的动作是在由编译指示和/或关键字定义的程序点处显式签名指令的插入
a)打开 ISS (ISS_START)(也见上文)
b)关闭 ISS (ISS_ST0P)(也见上文)
c) ISS签名检查
d)子函数
e)针对子函数的入口点(ISS_UPDATE)
影响编译器210的另一个问题是典型的编译器在编译代码时执行的优化。特别是 以下两种情况可能需要编译器210的优化行为的适应循环不变式优化和ISS函数调用。
关于循环不变式优化,编译器210可以得出这样的结论循环内的指令相关签名 的占位符显然未受循环的影响,且实际上可被移动到循环前面,以便减少占位符的“执行” 数量。然而,在这种情况下,当每循环迭代构成新的条件分支时,占位符不会被优化,而仍然 保持在循环中。
一些ISS函数具有由指令签名生成器250补丁的参数。指令签名生成器250假定 以下代码(翻译成汇编语言)
-·.
-M0Vff<Rd>, #<const>
-BL FCT_ISS_Start
-·.
MOVW将常量字值#〈const>移动至寄存器Rd。然后,使用指令“BLFCT_ISS_Start” 使程序(无条件)跳变到标签FCT_ISS_Start。这两个指令通常须是原子的,且尤其必须产 生独立于参数长度的MOVW指令。
关于代码优化,占位符插入组件215可被配置为验证编译器210的代码优化是否 与至少一个指令签名相关的占位符冲突。一旦验证或确定冲突,可阻止编译器210执行影 响至少一个指令签名相关的占位符的编译代码优化。
为了缓解ISS补丁和参考值计算,编译器/连接器210/240将在(.elf)文件246 的.debug_info DWARF节中提供额外信息。
-关于何为代码或常数的信息;
-关于在何处使能ISS的信息,例如,经由#pragmaFCT_ISS ON ;
-所有占位符和相应地址的列表;
-何处插入单板调用(veneercall)(涉及多个后续分支指令的调用)的信息;
-有关在多个机器语言之间切换的信息;
-有关尾部优化(一个函数运行至另一个)的信息;
-关于表在多重转换中的大小的信息;
使用分支表指令,这在多个架构(如TBB指令)中可用;
-代码区的地址范围;
-使能指令签名跟踪(例如,针对在连接和/或结合期间要被使用的正确库函数) 的区的地址范围;
-(全部)占位符插入的地址;
-有关函数指针的信息;
-有关函数的信息;
-有关函数结束的(地址)信息;
-有关switch-case 的信息。
为了能够提供额外的指令流签名信息,连接器240必须扩展(例如,通过扩展 242),从而向(例如)占位符列表提供所需的地址。
图3示出说明了针对指令签名支持的(标准)编译器210和编译模块212的交互的 示意性框图。如图2中所示,编译器210接收包括如通过用于源代码的高级编程语言提供 的多个语言结构的源代码202。一些语言结构与指令签名支持相关,诸如条件分支、函数调 用(特别是在运行期间函数地址是未知的函数),以及用于在程序运行期间控制和验证指令 签名的专用指令签名相关的语言结构。
语言结构可以从编译器210通过至编译模块212,该模块可检查语言结构是否会 引起指令签名相关的占位符的插入。为此,编译模块212包括语言结构识别器213。在已检 测到指令签名相关的语言结构的情况下,语言结构识别符213可通知占位符插入组件215。 特别的是,语言结构识别器213可提供有关签名相关的语言结构位于源文件何处(例如,通 过行号)和签名相关的语言结构类型的信息。
除了指令签名相关的占位符的自动插入之外,编译器210和/或编译模块212可 进一步提供标准代码生成的适应,以将占位符保持在恰当的位置。此外,编译器210和/或 编译模块212可进一步提供附加的信息,使指令签名生成器250更可靠。如果可能的话,编 译器210 (其对编译器210增加指令签名支持)的扩展应该对代码生成的影响最小,且高级 语言的代码应该在没有特定代码(除了使用指令流签名库函数之外)适应的情况下工作。
编译器210和/或编译模块212可以针对ISS库函数进行基本的语法检查。可以 检查以下规则
-在一个源文件的代码流内FCT_ISS_StopO后面跟着FCT_ISS_Start O ;
-FCT_ISS_Suspend()和 FCT_ISS_SuspendRestartO 后面跟着 FCT_ISS_ Resume O ;
-针对相应的FCT_ISS_Suspend O 或 FCT_ISS_SuspendRestart O,仅允许一个 FCT_ISS_ResumeO。
然后,占位符插入组件215可确定要插入到编译代码222或246的占位符。例如, 占位符插入组件215可确定占位符的(二进制)值,其大小及其确切位置(上游、下游或在由 编译器210响应指令签名相关的语言结构所产生的编译代码的标准指令内)。然后,该占位 符信息可被发送回使用它插入到编译代码的编译器210。可一步步进行源代码202的编译 和指令签名相关的占位符的插入,也就是说,当编译处理进行时,由编译器210将新的占位 符插入目前正在考虑的程序点。
在编译代码222或246中,占位符插入编译代码的其余部分,特别是标准的编译指 令。
对于由表明代码的ISS使能部分的开始和结束的关键字或编译指示封住的函数 和代码序列,编译器210可根据下面介绍的一些基本规则自动插入指令签名相关的占位 符。
对于条件代码序列,自动插入可如下为了处理非默认路径,编译器210须为每个 条件指令插入指令签名相关的占位符。所有条件序列(if-then-else、switch_case、while 循环、do while循环等)可减少到必须由编译器210或编译模块212识别并进行不同处理的两种情况。
不需要编译器210或编译模块212进行默认路径分析。编译器210或编译模块 212可在所有条件路径中添加指令签名相关的占位符。在不必要的指令签名相关的占位符 的情况下,指令签名生成器250可用NOP (无操作)补丁它们。
一般规则可能是编译器210或编译模块212须将占位符插入在条件跳变后执行的 下一条指令前面。然而,对于doihile循环,编译器210或编译模块212须直接将占位符 插入条件跳变的标签(控制流图的回边)。
编译模块212可进一步包括数据库接口,其被配置为查询包括由语言结构识别器 和占位符插入组件使用的多个可能的指令签名相关的语言结构和相应的指令签名相关的 占位符的数据库。该数据库也可能是编译模块212的一部分。该数据库可能包括用于控制 占位符插入组件关于至少一个指令签名相关的占位符的插入的至少一个插入规则(通常是 多个插入规则)。
图4说明了指令签名相关的语言结构如何通过两阶段处理(包括编译源代码202 和计算指令签名)来处理。指令签名相关的语言结构可对应于编译代码中的几个指令(在所 示实例中为五个指令)。具有编译模块212的编译器210被配置为将指令签名相关的占位 符插入编译代码222中。可以看出,占位符插入第三和第四指令之间,这可由占位符插入组 件215所使用的占位符插入规则的数据库中定义(见图3)。此外,占位符插入组件215可导 致编译器210插入多个标准指令中的一个,例如,将常量值加载到处理器的寄存器,诸如稍 后由指令签名生成器250计算的签名值。具有插入的占位符的编译代码222表示连接指令 签名增强的编译器和随后的指令签名生成的编译器接口数据结构。
指令签名生成器250被配置为检测占位符,并确定适当的签名值(其然后在占位 符的位置插入编译代码222)。指令签名生成器250输出具有指令签名256的编译代码256。
图5示出根据实施方式的指令签名生成器250的示意性框图。指令签名生成器250 包括占位符识别器251、签名计算器253,以及占位符替换器255。占位符识别器251被配置 为接收编译代码222或246 (例如,汇编代码或机器代码)并搜索表明占位符的模式。例如, 占位符可为实际上未由编译器210或处理器(最终程序将会在其上运行)使用的操作码。无 效操作码应该在处理器执行程序之前移除,以避免运行错误。占位符识别器251也可以或 者可替换地(例如)经由占位符信息接口接收关于已插入由编译模块212提供的编译代码的 占位符(见图4)的简要信息。当存在时,占位符信息接口可被配置为接收占位符信息(包括 有关占位符的辅助信息),并将辅助信息提供至签名计算器253。辅助信息可包括以下各项 中的至少一个相对于编译代码中的多个分支点的表的大小、表示函数结束的存储器地址、 包括有关插入编译代码的至少一个占位符及其占位符位置的信息的列表,以及表示在对其 使能指令签名支持的编译代码中至少一个受保护的代码段的开始和结束的地址表。签名计 算器253被配置为使用地址表用于确定签名值。
一旦由占位符识别器251发现或产生占位符,有关占位符的信息就被转发到签名 计算器253。如上所述,签名计算器253被配置为对目前处理的占位符位置计算实际的签名 值。签名值可为开始值、更新值,或如本文之前所述的参考值。签名计算器253可被配置为 基于计算出的签名值对于编译代码执行基本块分析。
由签名计算器253确定的签名值和关于(例如)占位符位置的信息被提供至占位符替换器255 (其被配置为执行用计算的签名值代替占位符)。由占位符替换器255提供或产 生的编译代码段通常在编译代码中占有的空间等于指令签名相关的占位符占有的空间。编 译代码段可包括处理器指令。占位符替换器255可被配置为从多个处理器指令中选择特定 的处理器指令,并在该特定的处理器指令的基础上产生编译代码段。
图6示出根据实施方式的方法的示意性流程图,其通常用于在高级语言源代码的 编译期间处理指令签名相关的信息。
在动作602中,识别高级语言源代码中的指令签名相关的语言结构。这可以基于 对高级语言源代码中关键字或编译指示的识别而进行。
在随后的动作604中,执行与编译处理的交互,以便将基于指令签名相关的语言 结构的至少一个指令签名相关的占位符插入由编译处理正在处理(或已经处理)的编译代 码中。
虽然在设备的背景下描述了一些方面,但是这些方面也代表相应方法的描述,其 中框或装置对应于方法步骤或方法步骤的特征。类似地,在方法步骤的背景下描述的方面 也代表相应设备的相应框或项或功能的描述。一些或所有的方法步骤可由(或使用)硬件设 备(例如微处理器、可编程计算机或电子电路)来执行。在一些实施方式中,最重要的方法步 骤中的某一个或多个可以由这样的设备来执行。
根据某些实施要求,本发明的实施方式可以按照硬件或软件实现。可使用具有存 储于其上的电子可读控制信号的数字存储介质执行该实现方式,例如软盘、DVD、蓝光、CD、 ROM、PR0M、EPR0M、EEPROM或闪存,其与可编程计算机系统合作(或能够与其合作),以便执行 各个方法。因此,数字存储介质可为计算机可读。
一些实施方式包括数据载体,其具有电子可读控制信号,其能够与可编程计算机 系统合作,以便执行本文所述的方法之一。
一般情况下,这里所描述的实施方式可以作为具有程序代码的计算机程序产品来 实现,当计算机程序产品在计算机上运行时,程序代码操作地执行方法之一。例如,程序代 码可存储在机器可读载体上。
其它实施方式包括存储于机器可读载体中的、用于执行本文所述方法之一的计算 机程序。
换言之,因此,一个实施方式为计算机程序,其具有用于当在计算机上运行计算机 程序时执行本文所述方法之一的程序代码。
因此,其它实施方式为数据载体(或数字存储介质,或计算机可读介质),其包括记 录在其上的用于执行本文所述方法之一的计算机程序。数据载体、数字存储介质或记录介 质通常是有形和/或非过渡的。
因此,其它实施方式为代表用于执行本文所述方法之一的计算机程序的数据流或 信号序列。例如,该数据流或信号序列可被配置为例如经由互联网通过数据通信连接来传 送。
其它实施方式包括处理装置,例如计算机或可编程逻辑设备,其被配置或适应以 执行本文所述方法之一。
其它实施方式包括计算机,其具有安装在其上的用于执行本文所述方法之一的计 算机程序。
其它实施方式包括设备或系统,其被配置为将用于执行本文所述的方法之一的计 算机程序转移(例如,电子地或光学地)至接收器。例如,接收器可为计算机、移动设备、存储 设备等。例如,设备或系统可包括用于将计算机程序传送到接收器的文件服务器。
在一些实施方式中,可编程逻辑装置(例如现场可编程门阵列)可以用来执行本文 所述方法的部分或全部功能。在一些实施方式中,现场可编程门阵列可与微处理器的合作, 以执行本文所述方法之一。一般来说,优选由任何硬件设备来执行方法。
术语,诸如“第一”、“第二”等用于描述各种元件、区域、部分等,且其并不旨在进行 限制。在整个说明书中,相同的术语指相同的元件。
如本文所使用的,术语“具有”、“包含”、“包括”等是开放的术语,其是指所述元件 和特征的存在,但是并不排除其他元件或特征。除非上下文中有明确的相反表述,否则冠词 “一个”、“所述”旨在包括多个以及单个。
应理解,除非另有特别注明,否则本文所述的各个实施方式的特征可互相组合。
虽然已经在本文中说明并描述了具体实施方式
,但是本领域的普通技术人员应理 解,在不背离本发明的范围的情况下,各种替代和/或等同的实现方式可取代所示和所描 述的特定实施方式。该申请旨在涵盖本文所讨论的具体实施方式
的任何调整或变化。因此, 预期本发明仅由权利要求和其等同物限制。
权利要求
1.一种用于对编译器提供指令签名支持的编译模块,所述编译模块包括 语言结构识别器,被配置为在供应至所述编译器的高级语言源代码中识别指令签名相关的语言结构;以及 占位符插入组件,被配置为与所述编译器交互,从而将基于所述指令签名相关的语言结构的至少一个指令签名相关的占位符插入由所述编译器基于所述高级语言源代码所处理的编译代码中。
2.根据权利要求1所述的编译模块,其中,所述签名相关的占位符的所述插入保留了给予所述编译器的原始的所述高级语言代码的逻辑功能。
3.根据权利要求1所述的编译模块,还包括数据库接口,被配置为查询包括由所述语言结构识别器和所述占位符插入组件使用的多个可能的指令签名相关的语言结构和相应的指令签名相关的占位符的数据库。
4.根据权利要求3所述的编译模块,其中,多个所述可能的指令签名相关的语言结构包括以下各项中的至少一个条件跳变、if-then结构、switch_case结构、while-loop结构、do-while结构和专用指令签名相关的关键字。
5.根据权利要求3所述的编译模块,其中,所述数据库还包括至少一个插入规则,用于控制所述占位符插入组件关于所述至少一个指令签名相关的占位符的所述插入。
6.根据权利要求1所述的编译模块,其中,所述编译代码是机器语言代码,且其中所述占位符插入组件被配置为选择所述至少一个指令签名相关的占位符,使得所述至少一个指令签名相关的占位符的大小等于在所述编译代码中最终取代所述至少一个指令签名相关的占位符的机器语言指令序列或机器语言指令的大小。
7.根据权利要求1所述的编译模块,其中,所述至少一个指令签名相关的占位符是以下各项之一用于参考签名值的占位符、用于签名更新值的占位符、以及用于指令签名相关的指令的占位符。
8.根据权利要求1所述的编译模块,还包括占位符信息收集器,被配置为收集有关插入所述编译代码中的指令签名相关的占位符的占位符信息并输出所述占位符信息。
9.根据权利要求1所述的编译模块,其中,所述语言结构识别器被配置为识别对其使能所述指令签名支持的受保护的程序代码段,且其中,所述编译模块还包括库调用信息收集器,所述库调用信息收集器被配置为收集与在所述受保护的程序代码段中发生的软件库调用相关的库调用信息,并提供所述库调用信息用于随后的连接处理使用。
10.根据权利要求1所述的编译模块,其中,所述语言结构识别器被配置为在对其使能所述指令签名支持的所述高级语言源代码中识别受保护的程序代码段的开始和结束,且其中,所述占位符插入组件被配置为使用相应的受保护段识别的结果,以便激活在所述受保护的程序代码段中插入所述至少一个指令签名相关的占位符,并禁用在非受保护的程序代码段中插入所述至少一个指令签名相关的占位符。
11.根据权利要求1所述的编译模块,其中,所述占位符插入组件进一步被配置为验证所述编译器的代码优化是否与所述至少一个指令签名相关的占位符冲突,且在验证到冲突时,阻止所述编译器执行影响所述至少一个指令签名相关的占位符的所述编译代码的优化。
12.一种指令签名生成器,包括用于编译代码的输入; 占位符识别器,被配置为在所述编译代码中识别指令签名相关的占位符; 签名计算器,被配置为针对在所述编译代码中发生所述指令签名相关的占位符的程序点确定签名值;以及 占位符替换器,被配置为基于所述程序点处的所述签名值插入编译代码段。
13.根据权利要求12所述的指令签名生成器,其中,所述编译代码是机器语言代码和汇编代码之一。
14.根据权利要求12所述的指令签名生成器,其中,由所述占位符替换器产生的所述编译代码段在所述编译代码中占用的空间等于所述指令签名相关的占位符所占用的空间。
15.根据权利要求12所述的指令签名生成器,其中,所述编译代码段包括处理器指令,其中,所述占位符替换器被配置为从多个处理器指令中选择特定的处理器指令,并在所述特定的处理器指令的基础上产生所述编译代码段。
16.根据权利要求12所述的指令签名生成器,其中,所述签名计算器被配置为基于计算出的所述签名值对所述编译代码执行基本块分析。
17.根据权利要求12所述的指令签名生成器,还包括占位符信息接口,被配置为接收包括有关所述指令签名相关的占位符的辅助信息的占位符信息,并将所述辅助信息提供至所述签名计算器。
18.根据权利要求17所述的指令签名生成器,其中,所述辅助信息包括以下各项中的至少一个与所述编译代码中的多个分支点相关的表的大小、表示函数结束的存储器地址、包括有关插入所述编译代码的所述至少一个指令签名相关的占位符及其占位符位置的信息的列表、以及表示在对其使能所述指令签名支持的所述编译代码中至少一个受保护的代码段的开始和结束的地址表,且其中,所述签名计算器被配置为使用所述地址表用于确定所述签名值。
19.一种在高级语言源代码的编译处理期间用于处理指令签名相关的信息的方法,所述方法包括 在所述高级语言源代码中识别指令签名相关的语言结构;以及 与所述编译处理交互,以便将基于所述指令签名相关的语言结构的至少一个指令签名相关的占位符插入在所述高级语言源代码的基础上通过所述编译处理所处理的编译代码中。
20.根据权利要求19所述的方法,其中,所述签名相关的占位符对于所述编译处理是透明的。
21.根据权利要求19所述的方法,进一步包括 对数据库进行查询,所述数据库包括要在所述指令签名相关的语言结构的所述识别期间以及与所述编译处理的交互期间要使用的多个可能的指令签名相关的语言结构和相应的指令签名相关的占位符。
22.根据权利要求21所述的方法,其中,多个所述可能的指令签名相关的语言结构包括以下各项中的至少一个条件跳变、if-then结构、switch-case结构、while-loop结构、do-while结构以及专用指令签名相关的关键字。
23.根据权利要求21所述的方法,其中,所述数据库还包括至少一个插入规则,用于控制所述至少一个指令签名相关的占位符的所述插入。
24.根据权利要求19所述的方法,其中,所述编译代码是机器语言代码,且其中选择所述至少一个指令签名相关的占位符,使得所述至少一个指令签名相关的占位符的大小等于在所述编译代码中最终取代所述至少一个指令签名相关的占位符的机器语言指令序列或机器语言指令的大小。
25.根据权利要求19所述的方法,其中,所述指令签名相关的占位符是以下各项之一用于参考签名值的占位符、用于签名更新值的占位符、以及用于指令签名相关的指令的占位符。
26.根据权利要求19所述的方法,进一步包括 收集有关插入所述编译代码中的指令签名相关的占位符的占位符信息;以及 输出所述占位符信息。
27.根据权利要求19所述的方法,进一步包括 识别对其使能所述指令签名支持的受保护的程序代码段; 收集与在所述受保护的程序代码段中发生的软件库调用相关的库调用信息;以及 提供所述库调用信息用于随后的连接处理使用。
28.根据权利要求19所述的方法,进一步包括 在对其使能所述指令签名支持的所述高级语言源代码中识别受保护的程序代码段的开始和结束,作为受保护的段识别;以及 使用所述受保护的段识别的结果,以便激活在所述受保护的程序代码段中插入所述至少一个指令签名相关的占位符,并禁用在非受保护的程序代码段中插入所述至少一个指令签名相关的占位符。
29.根据权利要求19所述的方法,进一步包括 验证所述编译处理的代码优化是否与所述至少一个指令签名相关的占位符冲突,且在验证到冲突时,阻止所述编译处理执行影响所述至少一个指令签名相关的占位符的所述编译代码的优化。
30.一种计算机可读的数字存储介质,具有程序代码的计算机程序存储于其上,在计算机上运行时所述程序代码用于执行在高级语言源代码的编译处理期间的处理指令签名相关的信息的方法,所述方法包括 在所述高级语言源代码中识别指令签名相关的语言结构;以及与所述编译处理交互,从而将基于所述指令签名相关的语言结构的至少一个指令签名相关的占位符插入由所述编译处理基于所述高级语言源代码所处理的编译代码中。
全文摘要
本发明涉及具有指令签名支持的分布式编译处理。其中,一种用于对编译器提供指令签名支持的编译模块,包括语言结构识别器和占位符插入组件。该语言结构识别器被配置为在供应至编译器的高级语言源代码中识别指令签名相关的语言结构。占位符插入组件被配置为与编译器交互,从而将基于指令签名相关的语言结构的至少一个指令签名相关的占位符插入由所述编译器基于高级语言源代码所处理的编译代码中。
文档编号G06F9/45GK103019799SQ201210246530
公开日2013年4月3日 申请日期2012年7月16日 优先权日2011年7月15日
发明者于尔根·迪维, 奔迪特·加梅尔, 斯特凡·曼格德 申请人:英飞凌科技股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1