字节序转换工具.pdf

上传人:b*** 文档编号:1033226 上传时间:2018-03-27 格式:PDF 页数:15 大小:517.04KB
返回 下载 相关 举报
摘要
申请专利号:

CN201010598057.8

申请日:

2010.12.21

公开号:

CN102103481A

公开日:

2011.06.22

当前法律状态:

授权

有效性:

有权

法律详情:

授权|||实质审查的生效IPC(主分类):G06F 9/30申请日:20101221|||公开

IPC分类号:

G06F9/30

主分类号:

G06F9/30

申请人:

英特尔公司

发明人:

M. P. 赖斯; H. 威尔金森; M. J. 多梅卡; E. V. 布雷夫诺夫; P. 拉赫纳

地址:

美国加利福尼亚州

优先权:

2009.12.21 US 12/643216

专利代理机构:

中国专利代理(香港)有限公司 72001

代理人:

马永利;王洪斌

PDF下载: PDF下载
内容摘要

本发明公开了字节序转换工具。在本发明的一个实施例中,代码(例如编译器、工具)可以生成信息,因此包括第一字节序格式(例如大字节序)的指针值的第一代码部分能够被适当地初始化,并且在具有第二字节序格式(例如小字节序)的平台上被执行。而且,本发明的各种实施例可以识别代码(例如源代码)的有问题区域,其中特定字节顺序通过void指针而被抛弃。

权利要求书

1: 一种方法, 包括 : 接收分别定义全局变量的第一和第二实例的第一和第二源代码部分, 其中每个实例具 有第一字节序格式并且这两个实例在编译时间都不能被完全地初始化 ; 生成对字节交换指令的第一和第二引用, 其被配置成分别将所述第一和第二实例转换 成第二字节序格式 ; 使用处理器来生成影子变量, 所述影子变量被配置成在编译时间之后并且基于所述第 一实例已经被字节交换来抑制所述第二实例的字节交换 ; 以及 将所述影子变量存储在耦合到所述处理器的存储器中。
2: 如权利要求 1 所述的方法, 其中, 基于所述全局变量是具有所述第一字节序格式的 指针, 这两个实例在编译时间都不能被完全地初始化。
3: 如权利要求 2 所述的方法, 其中, 所述影子变量被配置成指示所述第一实例是否被 字节交换。
4: 如权利要求 2 所述的方法, 其中, 所述影子变量被配置成基于所述影子变量已经从 弱定义的变量被转换成强定义的变量来抑制所述第二实例的字节交换。
5: 如权利要求 2 所述的方法, 包括 : 生成具有第一和第二字节序格式这二者的经编译 代码。
6: 如权利要求 2 所述的方法, 包括 : 生成保护变量, 所述保护变量被配置成确定, 在运 行时和在所述保护变量的初始化之后, 所述保护变量已经被字节转换, 其中所述保护变量 将利用已知的链接时间常量来被初始化。
7: 如权利要求 2 所述的方法, 其中, 所述第一和第二实例被配置成在编译时间之后分 别基于每一个都具有所述第一字节序格式的第一和第二链接时间常量来被初始化。
8: 如权利要求 1 所述的方法, 包括 : 接收包括 void 指针的第三源代码部分 ; 追踪通过所述 void 指针的字节顺序 ; 以及 确定基于所述 void 指针所发生的字节顺序不匹配。
9: 如权利要求 1 所述的方法, 包括 : 接收包括 void 指针的第三源代码部分 ; 追踪通过所述 void 指针的数据大小 ; 以及 确定基于所述 void 指针所发生的数据大小不匹配。
10: 一种包括介质的物品, 存储用于使基于处理器的系统能够执行以下操作的指令 : 接收分别定义全局变量的第一和第二实例的第一和第二代码部分, 其中所述全局变量 的每个实例具有第一字节序格式并且这两个实例在编译时间都不能被正确地初始化 ; 以及 生成第一变量, 所述第一变量被配置成在编译时间之后并且基于所述第一实例已经被 字节序转换来抑制所述第二实例的字节序转换。
11: 如权利要求 10 所述的物品, 其中, 所述全局变量是指针。
12: 如权利要求 11 所述的物品, 进一步存储用于使所述系统能够基于从编译器生成 的信息来重定位所述第一变量的指令, 其中所述第一变量被配置成基于所述重定位来抑制 所述第二实例的字节序转换。
13: 如权利要求 11 所述的物品, 其中, 所述第一实例基于第二全局变量的地址。 2
14: 如权利要求 11 所述的物品, 其中, 所述第一和第二代码部分被配置成被动态地链 接。
15: 如权利要求 10 所述的物品, 进一步存储用于使所述系统能够执行以下操作的指 令: 接收包括 void 指针的第三代码部分 ; 追踪通过所述 void 指针的字节顺序 ; 以及 确定基于所述 void 指针所发生的字节顺序不匹配。
16: 一种装置, 包括 : 耦合到存储器的处理器, 其执行以下操作 : (1) 使用所述存储器接收分别定义全局变 量的第一和第二实例的第一和第二源代码部分, 其中所述全局变量的每个实例具有第一字 节序格式并且这两个实例在编译时间都不能被完全地初始化 ; 以及 (2) 生成第一变量, 所 述第一变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述 第二实例的字节交换。
17: 如权利要求 15 所述的装置, 其中, 所述全局变量是指针。
18: 如权利要求 17 所述的装置, 其中, 所述第一变量被配置成基于所述第一变量已经 从弱定义的变量被转换成强定义的变量来抑制所述第二实例的字节交换。
19: 如权利要求 17 所述的装置, 其中, 所述第一和第二代码部分被配置成被动态地链 接。
20: 如权利要求 15 所述的装置, 其中, 所述处理器执行以下操作 : 接收包括 void 指针的第三源代码部分 ; 追踪通过所述 void 指针的字节顺序 ; 以及 确定基于所述 void 指针所发生的字节顺序不匹配。

说明书


字节序转换工具

    【技术领域】
     本发明涉及字节序转换。背景技术 字节序是数据存储和检索的属性。大字节序 (endian) 数据或变量可以以与小字 节序数据或变量相反的字节顺序被存储在存储器中。 小字节序数据可以以最低有效字节在 最低的存储器字节地址中的方式被存储, 而大字节序数据可以以最高有效字节在最低的存 储器字节地址中的方式被存储。具有相同值的大和小字节序变量在 CPU 寄存器中可以是相 同的, 但是在存储器中可能具有不同顺序。
     在没有识别一些数据以如何的不同顺序被存储在存储器中的情况下, 使用一种字 节序约定编写的源代码不可以在使用另一种字节序约定的平台上被执行。下面的 C 代码提 供一个例子 : { int i = 0x12345678; char c = *((char*)&i);
     } 如果该代码被编译并且在大字节序架构上运行, 则 “c” 将是 0x12, 但是如果该代码被 编译并且在小字节序架构上运行, 则 “c” 将是 0x78。因此, 为了在另一种字节序约定的计算 机系统平台上执行以一种字节序约定编写的代码, 可能需要字节序转换。 当例如源代码包 括 union(联合) 或者将第一指针 (其指向由多个字节构成的数据) 转换 (cast) 为第二指针 (其指向由单个字节构成的数据) 时, 这会是困难的。指针会产生困难, 因为一些双字节序编 译器不追踪通过指针 (例如 void 指针) 的字节顺序, 并且不产生对通过这样的指针的潜在字 节顺序改变的诊断。因此, 指针等会导致无法预料的字节顺序不相容性。 发明内容
     根据本发明的第一方面, 提供一种方法。 所述方法包括 : 接收分别定义全局变量的 第一和第二实例的第一和第二源代码部分, 其中每个实例具有第一字节序格式并且这两个 实例在编译时间都不能被完全地初始化 ; 生成对字节交换指令的第一和第二引用, 其被配 置成分别将所述第一和第二实例转换成第二字节序格式 ; 使用处理器来生成影子变量, 所 述影子变量被配置成在编译时间之后并且基于所述第一实例已经被字节交换来抑制所述 第二实例的字节交换 ; 以及将所述影子变量存储在耦合到所述处理器的存储器中。
     根据本发明的第二方面, 提供一种包括介质的物品。所述介质存储用于使基于处 理器的系统能够执行以下操作的指令 : 接收分别定义全局变量的第一和第二实例的第一和 第二代码部分, 其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编译 时间都不能被正确地初始化 ; 以及生成第一变量, 所述第一变量被配置成在编译时间之后 并且基于所述第一实例已经被字节序转换来抑制所述第二实例的字节序转换。根据本发明的第三方面, 提供一种装置。所述装置包括 : 耦合到存储器的处理器, 其执行以下操作 : (1) 使用所述存储器接收分别定义全局变量的第一和第二实例的第一和 第二源代码部分, 其中所述全局变量的每个实例具有第一字节序格式并且这两个实例在编 译时间都不能被完全地初始化 ; 以及 (2) 生成第一变量, 所述第一变量被配置成在编译时 间之后并且基于所述第一实例已经被字节交换来抑制所述第二实例的字节交换。 附图说明
     根据所附权利要求、 以下对一个或多个示例实施例的详细描述、 以及对应的图, 本 发明的实施例的特征和优点将变得显而易见, 其中 : 图 1 是用于本发明实施例中的方法的框图, 其包括伪代码 ; 图 2 是用于本发明实施例中的方法的框图, 其包括伪代码 ; 图 3 是本发明实施例中的方法的框图 ; 以及 图 4 是供本发明实施例使用的系统框图。 具体实施方式
     在以下描述中, 阐述了许多具体细节。然而, 应该理解, 可以在没有这些具体细节 的情况下实践本发明实施例。公知的电路、 结构和技术没有被详细示出以避免模糊对本描 述的理解。对 “一个实施例” 、 “实施例” 、 “示例实施例” 、 “各种实施例” 等等的提及表示, 如 此描述的 (一个或多个) 实施例可以包括特定的特征、 结构或特性, 但不是每个实施例必定 包括所述特定的特征、 结构或特性。 此外, 一些实施例可以具有针对其他实施例所描述的一 些、 所有特征, 或者不具有针对其他实施例所描述的特征。而且, 如在此所用的 “第一” 、 “第 二” 、 “第三” 等等描述了共同的对象, 并且表示相同对象的不同实例正在被提及。此类形容 词不打算暗示如此描述的对象必须或者在时间上、 在空间上、 按照等级或者以任何其他方 式处于给定的序列。而且, 为了清楚, 在此讨论的许多示例实施例提出编译器 (例如 C/C++ 编译器 ) 以及其对源代码的应用, 但是本发明实施例不必受限于此。例如, 尽管实施例包括 解析代码, 例如在编译器中所包括的解析工具, 但是其他实施例可以包括在其他形式的代 码中所包括的解析代码。
     在本发明的一个实施例中, 代码 (例如编译器、 工具) 可以生成信息, 因此包括第一 字节序格式 (例如大字节序) 的指针值的代码部分能够被适当地初始化并且在具有第二字 节序格式 (例如小字节序) 的平台上被执行。
     图 1 包括源代码 110 以及可执行代码 150 的直观表示。代码 110 可能易受 “复制 问题” 的影响。具体而言, 代码 110 包括代码部分 111、 112。每个部分包括全局变量 “g” 的 实例。全程变量 “g” 可以被常规的编译器初始化两次 : 一次在代码部分 111 的 (int* _ attribute_((bigendian)) g=&i1) 中, 并且再一次在代码部分 112 的 (int* _attribute_ ((bigendian)) g=&i2) 中。初始化包括例如通过向程序中的变量 / 数据结构分配初始 值来定义变量的过程。代码部分 111、 112 包括指针 ((int* _attribute_((bigendian)) g=&i1) 和 (int*_attribute_((bigendian)) g=&i2)), 这两个指针具有大字节序属性但是 分别指向不同的地址。每个地址具有大字节序属性。这些地址涉及两个不同的对象 ((int _attribute_((bigendian)) i1 = 1;) 和 (int _attribute_((bigendian)) i2 = 2;))。 编译器 (例如双字节序编译器) 可能尝试将源代码 110 从大字节序格式或约定转换成适合于具 有小字节序格式的平台的代码 (例如可执行代码) 。 为了这样做, 编译器可以对两个部分 111 和 112 中的大字节序全局变量 “g” 执行例如字节交换操作。这可能导致 “复制问题” , 因为 “g” 在第一字节序转换期间从大字节序被转换到小字节序, 然后 “g” 在第二转换中从小字节 序被转换回到大字节序。因此, 由于 “g” 被转换了两次, 所以可能发生复制问题, 从而颠倒 了所需的从大字节序到小字节序的转换。
     关于代码 110 可能如何导致复制问题的更具体的描述如下。两个源文件 111、 112 定义了全局大字节序变量 “g” 。常规的编译器可能基于不同的链接时间常量来初始化全局 大字节序变量 “g” , 即使直到在链接时间或在链接时间之后 (即在编译时间之后) 才知道链 接时间常量的地址 (例如 i1 或 i2) 也是如此。编译器可能不知道 “g” 的哪个特定值被链接 编辑器或系统载入器取得。因此, 对于每个部分 111、 112, 编译器生成用于 “g” 的交换操作, 即使 “g” 是直到在编译时间之后才能完全地初始化 (即正确地初始化) 的指针变量也是如 此。稍后, 链接编辑器可能仅取 “g” 的一个实例, 从而导致应用于 “g” 的单个实例的两个交 换操作。
     本发明的一个实施例如下解决了复制问题 : { If (g_shadow == FALSE) { Byteswap(g); g_shadow = TRUE; } else /* g 已经被交换了一次, 所以什么都不做 */ } 一般而言, 以上伪代码说明, 本发明实施例可以使用 “影子变量” 以确保全局变量 “g” 被 转换 (例如被字节交换) 一次, 并且确保后续对转换 “g” 的尝试被抑制。在 “g” 的初始转换 时, 变量 “g_shadow” 被从 “FALSE” 改变成 “TRUE” 。此后, 转换函数 (例如字节交换函数) 被 抑制, 因为它以 “g_shadow” 被设置为 “FALSE” 为条件。
     因此, 在本发明的一个实施例中, 对于利用非固有的 (native) 字节顺序的链接时 间常量初始化的每个全局变量, 编译器可以在应用程序 (application) 内生成变量 (例如不 可见的 “影子变量” ) 。可以在特殊的影子段 (section) 内部分配影子变量, 因此影子变量不 干扰应用程序变量。例如, 对影子变量的引用可以与对原始变量的引用放在一起。一开始, 一些或所有影子变量可以利用 “FALSE” 值来初始化, 这意味着对应的实际应用程序变量尚 未被交换。 稍后, 在数据初始化过程期间, 在第一次字节交换操作被应用于对应的原始变量 时, “TRUE” 值可以被放入每个影子变量中。一旦影子变量等于 “TRUE” , 则用于原始变量的 所有相继交换操作可以被抑制。 因此, 在本发明的一个实施例中, 影子变量产生全局变量状 态的 “影子” 以指示该全局变量是已经被字节交换还是尚未被字节交换, 并且有助于确保全 局变量仅被字节交换一次。
     返回到图 1, 代码 150 是使用本发明实施例从源代码 110 产生的经编译代码的直 观表示。对于全局变量 “g” , 代码 (例如编译器) 可以在代码部分 151 和 152 这二者中生成 影子变量 “g_shadow” , 因为这两个部分相关于源代码的包括 “g” 的部分 (即代码部分 111、112) 。 “g_shadow” 变量是从 “.initdata_shadow” 段分配的。 “g_shadow” 变量的初始值是 “FALSE” 。使用代码 (例如链接器) , 对 “g” 的符号引用可以经由示意箭头 154、 155、 157、 159 被从 “g” 的弱实例 (参见示意块 170) 转换 (例如重定位) 到 “g” 的强实例 (参见示意块 160) 。 “弱” 指定可以允许程序例如在程序执行期间改变变量的位置。相比之下, “强” 指定不会允 许程序在程序执行期间改变变量的位置。变量的强定义可以改变由弱变量定义的位置, 但 反过来并非如此。
     出于与以上关于 “g” 所讨论的相同原因, 对 “g_shadow” 的符号弱引用 (块 175) 还 可以经由示意箭头 156、 158 被重定位到 “g_shadow” 的单个强实例 (示意块 165) 。该重定 位可以基于由编译器提供的、 与在块 150 中提供重定位方向的箭头一致的重定位信息。包 括对 “g” 和 “g_shadow” 的重定位引用的代码版本没有在图 1 中示出, 但是将关于图 2 被提 出。稍后, 在后编译数据初始化过程中, 第一字节交换操作可以被应用于 “g” (其经由与箭 头 155 一致的重定位信息被重定位) , 并且可以将 “TRUE” 置于 “g_shadow” 处 (其经由与箭头 156 一致的重定位信息被重定位) 。然后, 当该过程遇到对于 “g” 的第二字节交换操作 (其经 由与箭头 159 一致的重定位信息被重定位) 时, “g_shadow” 已经具有 “TRUE” 值 (其经由与 箭头 158 一致的重定位信息被重定位) , 并且交换操作因而没有被执行。因此, 在实施例中, “g” 仅被交换一次并且保持正确值。 图 2 包括本发明的实施例。方法 200 包括源代码部分 205, 其类似于图 1 的部分 110。在块 210 中, 应用程序被编译。当双字节序功能被启用时, 编译器可以生成初始化数 据。由编译器提供的初始化数据或信息可以包括影子变量、 交换 g 引用、 以及与影子变量 和交换 g 引用相关的重定位信息。编译器可以将该初始化数据放入名为 “.initdata” 和 “.initdata_shadow” 的特殊的可执行与链接格式 (ELF) 段中, 如在块 215 中所示。块 215 类似于图 1 的部分 151。 取决于编译器选项, 该 .initdata 段可以被放入可载入段或注释段 中。
     在块 220 中, 诸如图 1 的部分 152 之类的其他目标文件以与块 215 类似的方式被 处理以生成更多的 .initdata 段。然后, 在块 225 中, 链接器可以以由图 1 中的箭头所指示 的方式组合 .initdata 段并重定位 g 交换和影子变量 (基于由编译器提供的重定位信息) 。 . initdata 段可以来自各种目标文件, 并且可以以链接的二进制来放置 .initdata 段。
     在块 230 中, 使用后链接工具对代码进行后处理, 所述后链接工具在本发明的一 个实施例中可以被包括在编译器中。 在其他实施例中, 所述后链接工具与编译器是分开的。 后链接工具可以读取可执行映像的 .initdata 段, 并且对具有在链接期间未被正确计算的 值的数据执行初始化 (例如, 诸如 “g” 变量之类的全局变量地址) 。因为可能留下未解析的 引用, 所以该工具可以检查位置是否不具有与之相关联的重定位, 例如针对图 1 所讨论的 那些重定位。 在那种情况下, 在运行时期间仅仅可以检测到正确值, 并且这里不可以执行交 换, 而是作为代替在块 245 中 (参见下文) 执行交换。否则, 地址所指向的数据可以基于由编 译器提供的初始化信息而如在块 235 中所示的那样被字节交换。注意, 在块 235 中, 一些字 节交换现在已经发生 (例如 long swapped(&i1) ) , 并且来自块 215 的一些条目 (例如 g 条 目) 已经被去除。由于先前发生的重定位, 所以存在单个 section_.initdata 段。
     在块 240 和 245 中, 可以发生动态运行时初始化。 如果从块 230 中的连编 ( build) 中留下未执行的字节交换 (例如这可能对于动态链接的应用程序发生) , 则它们可以在块
     245 中被执行, 在块 245 中在应用程序进入用户代码之前它们或者通过例如与可执行程序 静态链接的运行时初始化例程 (例如由编译器提供) 或者通过经修改的操作系统 (OS) 载入 器进行。在运行时初始化的情况下, 可能需要数据被定位到读 - 写 (R/W) 段以被 OS 载入。 由于由编译器提供的初始化信息, 所以这些字节交换会是可能的。
     在块 250 中, 可以发生验证。例如, 当应用程序启动时, 可以执行检查以确保没有 剩余的未解析的 .initdata 记录留下。这样做可以避免由于在经初始化的数据内部丢失字 节序校正而引起的程序故障。编译器可以生成运行时检查, 其确保初始化已经被适当地完 成。对于这种运行时检查的例子, 编译器可以为每个编译单元创建大字节序 “保护” 变量。 该 “保护变量” 可以利用已知的链接时间常量值和例程来初始化, 所述例程检查该值是否已 经被交换。如果没有发生这样的交换, 则应用程序可以终止于错误状态。否则, 该应用程序 可以在块 255 中继续进行。
     因此, 本发明的各种实施例涉及针对在编译时间不能被完全地解析的数据初始化 的解决方案。例如, 一个全局变量 (例如来自图 1 的 “g” ) 可以保持另一全局变量的地址。在 这种情况下, 直到链接阶段才可能知道要被分配给该全局变量的确切值。在编译时间不能 被完全地解析的数据初始化的另一例子涉及动态链接的应用程序, 其中仅在运行时的动态 链接阶段之后才知道最终值。如果假定实际的初始化值具有反向字节顺序, 则它应该在动 态链接之后并且在程序执行之前的某一阶段被交换。 在编译时间不能被完全地解析的数据 初始化的又一个例子涉及常用的允许变量的弱定义的应用程序二进制接口 (ABI) 。这样的 弱定义允许声明变量多于一次并且令链接器或载入器决定对象的哪个实例实际上被取得。 本发明的各种实施例是基于工具的, 并且可以使用标准 ELF 文件格式。这可以允 许用户把未经修改的基于 ELF 的工具 (像链接器和操作系统 (OS) 载入器) 用于本发明的实 施例。
     因此, 在本发明的一个实施例中, 期望移植 (port) 大字节序代码以在小字节序平 台上运行 (或反之亦然) 的程序员不需要重写他或她的完全在固有的单个字节序模式下运 行的应用程序。 作为替代, 可以以特定的字节序格式来指定源代码的部分, 例如需要大字节 序格式以便与网络分组交互的组件。 本发明的实施例于是可以提供将允许在稍后的时间对 代码部分进行适当初始化的数据。这些代码部分可以包括第一字节序格式 (例如大字节序) 的指针值, 所述指针值必须稍后在具有第二字节序格式 (例如小字节序) 的平台上执行。本 发明的各种实施例提供了对静态初始化对象 (包括指针对象) 的字节序的自动调整。一些实 施例解决了由多个分配的对象所引起的地址模糊性。而且, 一些实施例提供了对在例如应 用程序启动期间丢失字节序校正的运行时检测。 一些实施例使用特殊编译器生成信息来描 述非编译时间常数的大字节序指针值。 各种实施例使用后处理工具来在链接过程已经完成 之后校正字节序。附加的实施例使用特殊应用程序启动代码, 其能够在动态链接的应用程 序的情况下校正字节序。
     图 3 是本发明实施例中的方法的框图, 该方法可以解决例如由解析代码 (例如双 字节序编译器) 所引起的困难。一种这样的困难涉及不追踪通过 void 指针的字节顺序的编 译器。void 指针可以包括指向具有未知类型的值的指针。另一困难可以包括以下情形 : 通 过将指针向或从指针进行转换而丢失了字节顺序改变。 “转换” 可以包括从一种类型到另一 类型的程序员规定的数据转换, 例如从整数到浮点的转换。 由于这些示例困难, 所以一些编
     译器不能产生诊断 (例如诊断报告、 提示、 消息、 信息) , 所述诊断识别通过 void 指针而发生 的潜在字节顺序改变。这些困难会导致运行时问题。为了解决这些问题, 本发明的各种实 施例帮助识别代码的有问题区域, 其中例如特定字节顺序通过 void 指针而被抛弃。更具体 地说, 本发明的实施例可以向用户警告通过 void 指针的潜在有问题的转换, 从而有效地将 特定 void 与字节顺序区域相关联, 所以用户可以通过代码修改来解决所述转换。
     在图 3 的块 305 中, 程序员可以使用代码 (例如工具、 编译器) 来将代码的区域 (例 如数据结构) 标记为小或大字节序。如在此所解释的那样, 一些区域由于它们与网络分组等 等一起使用而可以被指定为例如大字节序。编译器还可以识别出存在 void 指针。在块 310 中, 可以识别字节序格式。在块 315 中, 如果 void 指针位于已经被标记为大字节序的代码 段中, 则编译器可以在内部创建 “大字节序 void” 。在块 320 中, 如果 void 指针位于指定为 小字节序的代码部分, 则编译器可以创建 “小字节序 void” 。尽管标准 void 类型可以匹配 任何语言类型, 但是特定于字节顺序的 void(例如 “大字节序 void” 或 “小字节序 void” ) 可能仅匹配例如具有相同字节顺序的数据 (例如非聚合数据) 和在相同缺省字节顺序的上 下文中声明的 (即定义的) 数据 (例如聚合数据) 。因此, 在块 325 中, 确定不匹配的存在。在 块 330 中, 如果不存在不匹配, 则可以允许匹配。然而, 在块 335 中, 当存在不匹配时, 编译 器可以发布报告该不匹配的诊断 (除非诊断被禁用) 。例如, 如果标准 void 指针从大字节序 值指向小字节序值, 则通常不会引起问题, 这是因为 void 指针是指向具有未知类型 (并且 因此也具有未确定的长度和未确定的解引用特性) 的值的指针。然而, 与 “大字节序 void” 的如此尝试的匹配可以在诊断中被记录 (块 340) , 并且引起程序员的注意, 其中他或她可以 在块 345 中解决该问题。
     对 void 类型名称 (例如大字节序 void) 的使用具有隐式地或显式地 (参见块 305) 分配给代码区域的缺省字节顺序的字节顺序属性。typedef 可以被用来基于相应缺省字节 顺序的 typedef 来创建大和小字节序 void 的 void 名称类型。
     本发明的一些实施例涉及不同类型的 void 指针。具体而言, 为了支持源转换成为 字节顺序中性的, 可以创建 void 类型的族, 对于其而言, 数据的大小由附于 void 名称的数 据的比特大小来捕获, 例如 “void32” 或 “void64” 。 按照类似于关于方法 300 所解释的方 式, 这些类型匹配相同比特大小的类型。 源代码可以被修改以使用这些名称, 并且然后编译 器将实施大小约束。
     因此, 在本发明的一些实施例中, 当编译器执行指针转换时, 它可以在出现几种情 形中的任一种时确定并发布诊断。例如, 当显式地或隐式地从不同的字节排序类型转换为 void 指针 (例如经由 void 指针从大字节序值转换到小字节序值) 时, 可以产生诊断。 “显式” 转换可以发生, 其中例如程序员显式地编写转换表达式, 例如 : { int beint; void *p = (void*)&beint; // 从大字节序整数指针转换到 void 指针 } “隐式” 转换是类似的, 但是可能如下不包括转换表达式 : {void *p = &beint; // 从大字节序整数指针转换到 void 指 针 } 对于显式转换, 编译器可以产生更少的诊断, 因为转换向编译器指示程序员的动作很 可能是有意的。然而, 通过 void 指针转换, 字节顺序可能丢失, 因此, 在本发明的一个实施 例中, 可以产生诊断而不管该转换的显式性质。
     因此可以在几种情形中产生诊断 (例如报告) 。例如, 在以下情形中可以发布报告 : 当 (i) 显式地或隐式地从 void 指针转换到不同的字节排序类型时 ; 当 (ii) 显式地或隐式 地从不同的字节排序类型转换到 void 指针时 ; 当 (iii) 隐式地从 void 指针转换到具有不 同字节顺序的另一 void 指针时 ; 以及当 (iv) 显式地或隐式地从或向 void 大小指针进行转 换时, 其中基本类型具有不同大小 (例如经由 void 指针从 32 位值转换到 64 位值) 。
     实施例可以在许多不同的系统类型中被实施。 现在参考图 4, 示出了根据本发明实 施例的系统的框图。多处理器系统 500 是点到点互连系统, 并且包括经由点到点互连 550 而耦合的第一处理器 570 和第二处理器 580。处理器 570 和 580 中的每一个可以是多核处 理器, 其包括第一和第二处理器核 (即处理器核 574a 和 574b 以及处理器核 584a 和 584b) , 不过在处理器中可能存在更多的核。术语 “处理器” 可以是指处理来自寄存器和 / 或存储 器的电子数据以将该电子数据变换成可以存储在寄存器和 / 或存储器中的其他电子数据 的任何设备或设备的一部分。 第一处理器 570 进一步包括存储控制器集线器 (MCH) 572 和点到点 (P-P) 接口 576 和 578。类似地, 第二处理器 580 包括 MCH 582 和 P-P 接口 586 和 588。MCH 572 和 582 将 处理器耦合到相应的存储器, 即存储器 532 和存储器 534, 其可以是本地地附于相应处理器 的主存储器 (例如动态随机存取存储器 (DRAM) ) 的部分。第一处理器 570 和第二处理器 580 可以分别经由 P-P 互连 552 和 554 被耦合到芯片组 590。芯片组 590 包括 P-P 接口 594 和 598。
     此外, 芯片组 590 包括接口 592 以通过 P-P 互连 539 将芯片组 590 与高性能图形 引擎 538 耦合。继而, 芯片组 590 可以经由接口 596 被耦合到第一总线 516。各种输入 / 输 出 (I/O) 设备 514 连同总线桥 518 一起可以被耦合到第一总线 516, 所述总线桥 518 将第一 总线 516 耦合到第二总线 520。各种设备可以被耦合到第二总线 520, 所述各种设备包括例 如键盘 / 鼠标 522、 通信设备 526、 以及数据存储单元 528 (例如盘驱动器或其他大容量存储 设备) , 在一个实施例中数据存储单元 528 可以包括代码 530。此外, 音频 I/O 524 可以被耦 合到第二总线 520。
     实施例可以以代码来实施并且可以被存储在存储介质上, 所述存储介质在其上存 储有指令, 所述指令能够被用来对系统进行编程以执行所述指令。所述存储介质可以包 括但不限于任何类型的盘 (包括软盘、 光盘、 固态驱动器 (SSD) 、 光盘只读存储器 (CD-ROM) 、 可重写光盘 (CD-RW) 、 以及磁光盘) , 半导体器件 (例如只读存储器 (ROM) ) , 随机存取存储器 (RAM) (例如动态随机存取存储器 (DRAM) 、 静态随机存取存储器 (SRAM) 、 可擦除可编程只读 存储器 (EPROM) 、 闪速存储器、 电可擦除可编程只读存储器 (EEPROM) ) , 磁或光卡, 或适合于 存储电子指令的任何其他类型的介质。
     在此已参考诸如指令、 函数、 过程、 数据结构、 应用程序、 配置设置、 代码等之类的
     数据描述了本发明的实施例。当数据被机器访问时, 该机器可以通过执行任务、 定义抽象 数据类型、 建立低级硬件上下文、 和 / 或执行其他操作来进行响应, 如在此更详细描述的那 样。数据可以被存储在易失性和 / 或非易失性的数据存储装置中。为了本公开的目的, 术 语 “代码” 或 “程序” 涵盖了大范围的组件和构造, 其包括应用程序、 驱动器、 过程、 例程、 方 法、 模块、 以及子程序。因此, 术语 “代码” 或 “程序” 可以被用来指代在被处理系统执行时 执行 (一个或多个) 期望操作的指令的任何集合。另外, 可替换的实施例可以包括使用少于 所有所公开操作的过程、 使用附加操作的过程、 以不同序列使用相同操作的过程、 以及其中 在此所公开的各个操作被组合、 细分或以其他方式改变的过程。在此常常关于字节交换指 令讨论了字节序转换, 但是各种实施例不一定限于采用任何特定类型的指令来执行或促进 字节序转换。
     尽管已经相对于有限数目的实施例描述了本发明, 但是本领域技术人员将由其认 识到许多修改和变化。 所附权利要求打算覆盖落入本发明的真实精神和范围内的所有这样 的修改和变化。

字节序转换工具.pdf_第1页
第1页 / 共15页
字节序转换工具.pdf_第2页
第2页 / 共15页
字节序转换工具.pdf_第3页
第3页 / 共15页
点击查看更多>>
资源描述

《字节序转换工具.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。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1