《字节序转换工具.pdf》由会员分享,可在线阅读,更多相关《字节序转换工具.pdf(15页珍藏版)》请在专利查询网上搜索。
1、10申请公布号CN102103481A43申请公布日20110622CN102103481ACN102103481A21申请号201010598057822申请日2010122112/64321620091221USG06F9/3020060171申请人英特尔公司地址美国加利福尼亚州72发明人MP赖斯H威尔金森MJ多梅卡EV布雷夫诺夫P拉赫纳74专利代理机构中国专利代理香港有限公司72001代理人马永利王洪斌54发明名称字节序转换工具57摘要本发明公开了字节序转换工具。在本发明的一个实施例中,代码(例如编译器、工具)可以生成信息,因此包括第一字节序格式(例如大字节序)的指针值的第一代码部分能够。
2、被适当地初始化,并且在具有第二字节序格式(例如小字节序)的平台上被执行。而且,本发明的各种实施例可以识别代码(例如源代码)的有问题区域,其中特定字节顺序通过VOID指针而被抛弃。30优先权数据51INTCL19中华人民共和国国家知识产权局12发明专利申请权利要求书2页说明书8页附图4页CN102103484A1/2页21一种方法,包括接收分别定义全局变量的第一和第二实例的第一和第二源代码部分,其中每个实例具有第一字节序格式并且这两个实例在编译时间都不能被完全地初始化;生成对字节交换指令的第一和第二引用,其被配置成分别将所述第一和第二实例转换成第二字节序格式;使用处理器来生成影子变量,所述影子变。
3、量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换;以及将所述影子变量存储在耦合到所述处理器的存储器中。2如权利要求1所述的方法,其中,基于所述全局变量是具有所述第一字节序格式的指针,这两个实例在编译时间都不能被完全地初始化。3如权利要求2所述的方法,其中,所述影子变量被配置成指示所述第一实例是否被字节交换。4如权利要求2所述的方法,其中,所述影子变量被配置成基于所述影子变量已经从弱定义的变量被转换成强定义的变量来抑制所述第二实例的字节交换。5如权利要求2所述的方法,包括生成具有第一和第二字节序格式这二者的经编译代码。6如权利要求2所述的方法,包括生成保护变。
4、量,所述保护变量被配置成确定,在运行时和在所述保护变量的初始化之后,所述保护变量已经被字节转换,其中所述保护变量将利用已知的链接时间常量来被初始化。7如权利要求2所述的方法,其中,所述第一和第二实例被配置成在编译时间之后分别基于每一个都具有所述第一字节序格式的第一和第二链接时间常量来被初始化。8如权利要求1所述的方法,包括接收包括VOID指针的第三源代码部分;追踪通过所述VOID指针的字节顺序;以及确定基于所述VOID指针所发生的字节顺序不匹配。9如权利要求1所述的方法,包括接收包括VOID指针的第三源代码部分;追踪通过所述VOID指针的数据大小;以及确定基于所述VOID指针所发生的数据大小不。
5、匹配。10一种包括介质的物品,存储用于使基于处理器的系统能够执行以下操作的指令接收分别定义全局变量的第一和第二实例的第一和第二代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译时间都不能被正确地初始化;以及生成第一变量,所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节序转换来抑制所述第二实例的字节序转换。11如权利要求10所述的物品,其中,所述全局变量是指针。12如权利要求11所述的物品,进一步存储用于使所述系统能够基于从编译器生成的信息来重定位所述第一变量的指令,其中所述第一变量被配置成基于所述重定位来抑制所述第二实例的字节序转换。13如权利要求11所。
6、述的物品,其中,所述第一实例基于第二全局变量的地址。权利要求书CN102103481ACN102103484A2/2页314如权利要求11所述的物品,其中,所述第一和第二代码部分被配置成被动态地链接。15如权利要求10所述的物品,进一步存储用于使所述系统能够执行以下操作的指令接收包括VOID指针的第三代码部分;追踪通过所述VOID指针的字节顺序;以及确定基于所述VOID指针所发生的字节顺序不匹配。16一种装置,包括耦合到存储器的处理器,其执行以下操作(1)使用所述存储器接收分别定义全局变量的第一和第二实例的第一和第二源代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译时。
7、间都不能被完全地初始化;以及(2)生成第一变量,所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换。17如权利要求15所述的装置,其中,所述全局变量是指针。18如权利要求17所述的装置,其中,所述第一变量被配置成基于所述第一变量已经从弱定义的变量被转换成强定义的变量来抑制所述第二实例的字节交换。19如权利要求17所述的装置,其中,所述第一和第二代码部分被配置成被动态地链接。20如权利要求15所述的装置,其中,所述处理器执行以下操作接收包括VOID指针的第三源代码部分;追踪通过所述VOID指针的字节顺序;以及确定基于所述VOID指针所发生的字节顺序不。
8、匹配。权利要求书CN102103481ACN102103484A1/8页4字节序转换工具技术领域0001本发明涉及字节序转换。背景技术0002字节序是数据存储和检索的属性。大字节序(ENDIAN)数据或变量可以以与小字节序数据或变量相反的字节顺序被存储在存储器中。小字节序数据可以以最低有效字节在最低的存储器字节地址中的方式被存储,而大字节序数据可以以最高有效字节在最低的存储器字节地址中的方式被存储。具有相同值的大和小字节序变量在CPU寄存器中可以是相同的,但是在存储器中可能具有不同顺序。0003在没有识别一些数据以如何的不同顺序被存储在存储器中的情况下,使用一种字节序约定编写的源代码不可以在使。
9、用另一种字节序约定的平台上被执行。下面的C代码提供一个例子INTI0X12345678CHARCCHAR如果该代码被编译并且在大字节序架构上运行,则“C”将是0X12,但是如果该代码被编译并且在小字节序架构上运行,则“C”将是0X78。因此,为了在另一种字节序约定的计算机系统平台上执行以一种字节序约定编写的代码,可能需要字节序转换。当例如源代码包括UNION(联合)或者将第一指针(其指向由多个字节构成的数据)转换(CAST)为第二指针(其指向由单个字节构成的数据)时,这会是困难的。指针会产生困难,因为一些双字节序编译器不追踪通过指针(例如VOID指针)的字节顺序,并且不产生对通过这样的指针的潜。
10、在字节顺序改变的诊断。因此,指针等会导致无法预料的字节顺序不相容性。发明内容0004根据本发明的第一方面,提供一种方法。所述方法包括接收分别定义全局变量的第一和第二实例的第一和第二源代码部分,其中每个实例具有第一字节序格式并且这两个实例在编译时间都不能被完全地初始化;生成对字节交换指令的第一和第二引用,其被配置成分别将所述第一和第二实例转换成第二字节序格式;使用处理器来生成影子变量,所述影子变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换;以及将所述影子变量存储在耦合到所述处理器的存储器中。0005根据本发明的第二方面,提供一种包括介质的物品。所述介质存。
11、储用于使基于处理器的系统能够执行以下操作的指令接收分别定义全局变量的第一和第二实例的第一和第二代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译时间都不能被正确地初始化;以及生成第一变量,所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节序转换来抑制所述第二实例的字节序转换。说明书CN102103481ACN102103484A2/8页50006根据本发明的第三方面,提供一种装置。所述装置包括耦合到存储器的处理器,其执行以下操作(1)使用所述存储器接收分别定义全局变量的第一和第二实例的第一和第二源代码部分,其中所述全局变量的每个实例具有第一字节序格式并且这。
12、两个实例在编译时间都不能被完全地初始化;以及(2)生成第一变量,所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换。附图说明0007根据所附权利要求、以下对一个或多个示例实施例的详细描述、以及对应的图,本发明的实施例的特征和优点将变得显而易见,其中图1是用于本发明实施例中的方法的框图,其包括伪代码;图2是用于本发明实施例中的方法的框图,其包括伪代码;图3是本发明实施例中的方法的框图;以及图4是供本发明实施例使用的系统框图。具体实施方式0008在以下描述中,阐述了许多具体细节。然而,应该理解,可以在没有这些具体细节的情况下实践本发明实施例。公知的电路。
13、、结构和技术没有被详细示出以避免模糊对本描述的理解。对“一个实施例”、“实施例”、“示例实施例”、“各种实施例”等等的提及表示,如此描述的(一个或多个)实施例可以包括特定的特征、结构或特性,但不是每个实施例必定包括所述特定的特征、结构或特性。此外,一些实施例可以具有针对其他实施例所描述的一些、所有特征,或者不具有针对其他实施例所描述的特征。而且,如在此所用的“第一”、“第二”、“第三”等等描述了共同的对象,并且表示相同对象的不同实例正在被提及。此类形容词不打算暗示如此描述的对象必须或者在时间上、在空间上、按照等级或者以任何其他方式处于给定的序列。而且,为了清楚,在此讨论的许多示例实施例提出编译。
14、器(例如C/C编译器以及其对源代码的应用,但是本发明实施例不必受限于此。例如,尽管实施例包括解析代码,例如在编译器中所包括的解析工具,但是其他实施例可以包括在其他形式的代码中所包括的解析代码。0009在本发明的一个实施例中,代码(例如编译器、工具)可以生成信息,因此包括第一字节序格式(例如大字节序)的指针值的代码部分能够被适当地初始化并且在具有第二字节序格式(例如小字节序)的平台上被执行。0010图1包括源代码110以及可执行代码150的直观表示。代码110可能易受“复制问题”的影响。具体而言,代码110包括代码部分111、112。每个部分包括全局变量“G”的实例。全程变量“G”可以被常规的编。
15、译器初始化两次一次在代码部分111的INT_ATTRIBUTE_BIGENDIANG和INT_ATTRIBUTE_BIGENDIANI22。编说明书CN102103481ACN102103484A3/8页6译器(例如双字节序编译器)可能尝试将源代码110从大字节序格式或约定转换成适合于具有小字节序格式的平台的代码(例如可执行代码)。为了这样做,编译器可以对两个部分111和112中的大字节序全局变量“G”执行例如字节交换操作。这可能导致“复制问题”,因为“G”在第一字节序转换期间从大字节序被转换到小字节序,然后“G”在第二转换中从小字节序被转换回到大字节序。因此,由于“G”被转换了两次,所以可能。
16、发生复制问题,从而颠倒了所需的从大字节序到小字节序的转换。0011关于代码110可能如何导致复制问题的更具体的描述如下。两个源文件111、112定义了全局大字节序变量“G”。常规的编译器可能基于不同的链接时间常量来初始化全局大字节序变量“G”,即使直到在链接时间或在链接时间之后(即在编译时间之后)才知道链接时间常量的地址(例如I1或I2)也是如此。编译器可能不知道“G”的哪个特定值被链接编辑器或系统载入器取得。因此,对于每个部分111、112,编译器生成用于“G”的交换操作,即使“G”是直到在编译时间之后才能完全地初始化(即正确地初始化)的指针变量也是如此。稍后,链接编辑器可能仅取“G”的一个。
17、实例,从而导致应用于“G”的单个实例的两个交换操作。0012本发明的一个实施例如下解决了复制问题IFG_SHADOWFALSEBYTESWAPGG_SHADOWTRUEELSE/G已经被交换了一次,所以什么都不做/一般而言,以上伪代码说明,本发明实施例可以使用“影子变量”以确保全局变量“G”被转换(例如被字节交换)一次,并且确保后续对转换“G”的尝试被抑制。在“G”的初始转换时,变量“G_SHADOW”被从“FALSE”改变成“TRUE”。此后,转换函数(例如字节交换函数)被抑制,因为它以“G_SHADOW”被设置为“FALSE”为条件。0013因此,在本发明的一个实施例中,对于利用非固有的(。
18、NATIVE)字节顺序的链接时间常量初始化的每个全局变量,编译器可以在应用程序(APPLICATION)内生成变量(例如不可见的“影子变量”)。可以在特殊的影子段(SECTION)内部分配影子变量,因此影子变量不干扰应用程序变量。例如,对影子变量的引用可以与对原始变量的引用放在一起。一开始,一些或所有影子变量可以利用“FALSE”值来初始化,这意味着对应的实际应用程序变量尚未被交换。稍后,在数据初始化过程期间,在第一次字节交换操作被应用于对应的原始变量时,“TRUE”值可以被放入每个影子变量中。一旦影子变量等于“TRUE”,则用于原始变量的所有相继交换操作可以被抑制。因此,在本发明的一个实施例。
19、中,影子变量产生全局变量状态的“影子”以指示该全局变量是已经被字节交换还是尚未被字节交换,并且有助于确保全局变量仅被字节交换一次。0014返回到图1,代码150是使用本发明实施例从源代码110产生的经编译代码的直观表示。对于全局变量“G”,代码(例如编译器)可以在代码部分151和152这二者中生成影子变量“G_SHADOW”,因为这两个部分相关于源代码的包括“G”的部分(即代码部分111、说明书CN102103481ACN102103484A4/8页7112)。“G_SHADOW”变量是从“INITDATA_SHADOW”段分配的。“G_SHADOW”变量的初始值是“FALSE”。使用代码(例。
20、如链接器),对“G”的符号引用可以经由示意箭头154、155、157、159被从“G”的弱实例(参见示意块170)转换(例如重定位)到“G”的强实例(参见示意块160)。“弱”指定可以允许程序例如在程序执行期间改变变量的位置。相比之下,“强”指定不会允许程序在程序执行期间改变变量的位置。变量的强定义可以改变由弱变量定义的位置,但反过来并非如此。0015出于与以上关于“G”所讨论的相同原因,对“G_SHADOW”的符号弱引用(块175)还可以经由示意箭头156、158被重定位到“G_SHADOW”的单个强实例(示意块165)。该重定位可以基于由编译器提供的、与在块150中提供重定位方向的箭头一致。
21、的重定位信息。包括对“G”和“G_SHADOW”的重定位引用的代码版本没有在图1中示出,但是将关于图2被提出。稍后,在后编译数据初始化过程中,第一字节交换操作可以被应用于“G”(其经由与箭头155一致的重定位信息被重定位),并且可以将“TRUE”置于“G_SHADOW”处(其经由与箭头156一致的重定位信息被重定位)。然后,当该过程遇到对于“G”的第二字节交换操作(其经由与箭头159一致的重定位信息被重定位)时,“G_SHADOW”已经具有“TRUE”值(其经由与箭头158一致的重定位信息被重定位),并且交换操作因而没有被执行。因此,在实施例中,“G”仅被交换一次并且保持正确值。0016图2包。
22、括本发明的实施例。方法200包括源代码部分205,其类似于图1的部分110。在块210中,应用程序被编译。当双字节序功能被启用时,编译器可以生成初始化数据。由编译器提供的初始化数据或信息可以包括影子变量、交换G引用、以及与影子变量和交换G引用相关的重定位信息。编译器可以将该初始化数据放入名为“INITDATA”和“INITDATA_SHADOW”的特殊的可执行与链接格式(ELF)段中,如在块215中所示。块215类似于图1的部分151。取决于编译器选项,该INITDATA段可以被放入可载入段或注释段中。0017在块220中,诸如图1的部分152之类的其他目标文件以与块215类似的方式被处理以生。
23、成更多的INITDATA段。然后,在块225中,链接器可以以由图1中的箭头所指示的方式组合INITDATA段并重定位G交换和影子变量(基于由编译器提供的重定位信息)。INITDATA段可以来自各种目标文件,并且可以以链接的二进制来放置INITDATA段。0018在块230中,使用后链接工具对代码进行后处理,所述后链接工具在本发明的一个实施例中可以被包括在编译器中。在其他实施例中,所述后链接工具与编译器是分开的。后链接工具可以读取可执行映像的INITDATA段,并且对具有在链接期间未被正确计算的值的数据执行初始化(例如,诸如“G”变量之类的全局变量地址)。因为可能留下未解析的引用,所以该工具可以。
24、检查位置是否不具有与之相关联的重定位,例如针对图1所讨论的那些重定位。在那种情况下,在运行时期间仅仅可以检测到正确值,并且这里不可以执行交换,而是作为代替在块245中(参见下文)执行交换。否则,地址所指向的数据可以基于由编译器提供的初始化信息而如在块235中所示的那样被字节交换。注意,在块235中,一些字节交换现在已经发生(例如LONGSWAPPED(VOIDPVOID/从大字节序整数指针转换到VOID指针“隐式”转换是类似的,但是可能如下不包括转换表达式说明书CN102103481ACN102103484A7/8页10VOIDP/从大字节序整数指针转换到VOID指针对于显式转换,编译器可以产。
25、生更少的诊断,因为转换向编译器指示程序员的动作很可能是有意的。然而,通过VOID指针转换,字节顺序可能丢失,因此,在本发明的一个实施例中,可以产生诊断而不管该转换的显式性质。0029因此可以在几种情形中产生诊断(例如报告)。例如,在以下情形中可以发布报告当(I)显式地或隐式地从VOID指针转换到不同的字节排序类型时;当(II)显式地或隐式地从不同的字节排序类型转换到VOID指针时;当(III)隐式地从VOID指针转换到具有不同字节顺序的另一VOID指针时;以及当(IV)显式地或隐式地从或向VOID大小指针进行转换时,其中基本类型具有不同大小(例如经由VOID指针从32位值转换到64位值)。00。
26、30实施例可以在许多不同的系统类型中被实施。现在参考图4,示出了根据本发明实施例的系统的框图。多处理器系统500是点到点互连系统,并且包括经由点到点互连550而耦合的第一处理器570和第二处理器580。处理器570和580中的每一个可以是多核处理器,其包括第一和第二处理器核(即处理器核574A和574B以及处理器核584A和584B),不过在处理器中可能存在更多的核。术语“处理器”可以是指处理来自寄存器和/或存储器的电子数据以将该电子数据变换成可以存储在寄存器和/或存储器中的其他电子数据的任何设备或设备的一部分。0031第一处理器570进一步包括存储控制器集线器(MCH)572和点到点(PP)。
27、接口576和578。类似地,第二处理器580包括MCH582和PP接口586和588。MCH572和582将处理器耦合到相应的存储器,即存储器532和存储器534,其可以是本地地附于相应处理器的主存储器(例如动态随机存取存储器(DRAM)的部分。第一处理器570和第二处理器580可以分别经由PP互连552和554被耦合到芯片组590。芯片组590包括PP接口594和598。0032此外,芯片组590包括接口592以通过PP互连539将芯片组590与高性能图形引擎538耦合。继而,芯片组590可以经由接口596被耦合到第一总线516。各种输入/输出(I/O)设备514连同总线桥518一起可以被耦。
28、合到第一总线516,所述总线桥518将第一总线516耦合到第二总线520。各种设备可以被耦合到第二总线520,所述各种设备包括例如键盘/鼠标522、通信设备526、以及数据存储单元528(例如盘驱动器或其他大容量存储设备),在一个实施例中数据存储单元528可以包括代码530。此外,音频I/O524可以被耦合到第二总线520。0033实施例可以以代码来实施并且可以被存储在存储介质上,所述存储介质在其上存储有指令,所述指令能够被用来对系统进行编程以执行所述指令。所述存储介质可以包括但不限于任何类型的盘(包括软盘、光盘、固态驱动器(SSD)、光盘只读存储器(CDROM)、可重写光盘(CDRW)、以及。
29、磁光盘),半导体器件(例如只读存储器(ROM),随机存取存储器(RAM)(例如动态随机存取存储器(DRAM)、静态随机存取存储器(SRAM)、可擦除可编程只读存储器(EPROM)、闪速存储器、电可擦除可编程只读存储器(EEPROM),磁或光卡,或适合于存储电子指令的任何其他类型的介质。0034在此已参考诸如指令、函数、过程、数据结构、应用程序、配置设置、代码等之类的说明书CN102103481ACN102103484A8/8页11数据描述了本发明的实施例。当数据被机器访问时,该机器可以通过执行任务、定义抽象数据类型、建立低级硬件上下文、和/或执行其他操作来进行响应,如在此更详细描述的那样。数据。
30、可以被存储在易失性和/或非易失性的数据存储装置中。为了本公开的目的,术语“代码”或“程序”涵盖了大范围的组件和构造,其包括应用程序、驱动器、过程、例程、方法、模块、以及子程序。因此,术语“代码”或“程序”可以被用来指代在被处理系统执行时执行(一个或多个)期望操作的指令的任何集合。另外,可替换的实施例可以包括使用少于所有所公开操作的过程、使用附加操作的过程、以不同序列使用相同操作的过程、以及其中在此所公开的各个操作被组合、细分或以其他方式改变的过程。在此常常关于字节交换指令讨论了字节序转换,但是各种实施例不一定限于采用任何特定类型的指令来执行或促进字节序转换。0035尽管已经相对于有限数目的实施例描述了本发明,但是本领域技术人员将由其认识到许多修改和变化。所附权利要求打算覆盖落入本发明的真实精神和范围内的所有这样的修改和变化。说明书CN102103481ACN102103484A1/4页12图1说明书附图CN102103481ACN102103484A2/4页13图2说明书附图CN102103481ACN102103484A3/4页14图3说明书附图CN102103481ACN102103484A4/4页15图4说明书附图CN102103481A。