- 浏览: 1578485 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (289)
- java 语法基础 (51)
- spring (8)
- mvc struct /Ant --build.xml (8)
- SOA (0)
- oracle 9i/10g (23)
- sql server 2000-2005 (3)
- 数据库基础知识 (6)
- 设计模式与软件架构 (10)
- Hibernate 持久化 (9)
- J2SE/J2EE/J2ME/AJAX 技术 (8)
- JSF 技术 (3)
- JAVA 图形化 (0)
- JMS (40)
- Eclipse 3.2 IDE 开发技巧 (13)
- 项目处理方法集合 (2)
- html/jsp/javascript (2)
- Unix/Linux (9)
- j2me/ARM/windriver/嵌入式 (4)
- 电信科学 (8)
- jsp (1)
- c/c++ (1)
- LZW压缩算法(java) (2)
- Android (77)
- 版本管理git/svn (2)
最新评论
-
huihai:
有demo吗?
NamingStrategy实现动态表名映射 -
cangbaotu:
推荐给大家一些有用的爬虫源码:https://github.c ...
网络爬虫(源代码参考) -
tuspark:
除了.classpath文件以外,.project文件也应该了 ...
Eclipse .classpath文件浅谈 -
tuspark:
造成eclipse自动关闭的原因有很多,这里有很多介绍:ecl ...
eclipse 自动关闭 解决方案 -
DEMONU:
网上都是这些,这种文章。。。
ActiveMQ中的消息持久性
将 Linux 应用程序移植到 64 位系统上平滑迁移的技巧和技术 |
级别: 初级 Harsha S. Adiga (haradiga@in.ibm.com), 软件工程师, IBM 2006 年 5 月 18 日 随着 64 位体系结构的普及,针对 64 位系统准备好您的 Linux® 软件已经变得比以前更为重要。在本文中,您将学习如何在进行语句声明、赋值、位移、类型转换、字符串格式化以及更多操作时,防止出现可移植性缺陷。<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--> Linux 是可以使用 64 位处理器的跨平台操作系统之一,现在 64 位的系统在服务器和桌面端都已经非常常见了。很多开发人员现在都面临着需要将自己的应用程序从 32 位环境移植到 64 位环境中。随着 Intel® Itanium® 和其他 64 位处理器的引入,使软件针对 64 位环境做好准备变得日益重要了。 与 UNIX® 和其他类 UNIX 操作系统一样,Linux 使用了 LP64 标准,其中指针和长整数都是 64 位的,而普通的整数则依然是 32 位的。尽管有些高级语言并不会受到这种类型大小不同的影响,但是另外一些语言(例如 C 语言)却的确会受到这种影响。 将应用程序从 32 位系统移植到 64 位系统上的工作可能会非常简单,也可能会非常困难,这取决于这些应用程序是如何编写和维护的。很多琐碎的问题都可能导致产生问题,即使在一个编写得非常好的高度可移植的应用程序中也是如此,因此本文将对这些问题进行归纳总结,并给出解决这些问题的一些方法建议。 32 位平台有很多限制,这些限制正在阻碍大型应用程序(例如数据库)开发人员的工作进展,尤其对那些希望充分利用计算机硬件优点的开发人员来说更是如此。科学计算通常要依赖于浮点计算,而有些应用程序(例如金融计算)则需要一个比较狭窄的数字范围,但是却要求更高的精度,其精度高于浮点数所提供的精度。64 位数学运算提供了这种更高精度的定点数学计算,同时还提供了足够的数字范围。现在在计算机业界中有很多关于 32 位地址空间所表示的地址空间的讨论。32 位指针只能寻址 4GB 的虚拟地址空间。我们可以克服这种限制,但是应用程序开发就变得非常复杂了,其性能也会显著降低。 在语言实现方面,目前的 C 语言标准要求 “long long” 数据类型至少是 64 位的。然而,其实现可能会将其定义为更大。 另外一个需要改进的地方是日期。在 Linux 中,日期是使用 32 位整数来表示的,该值所表示的是从 1970 年 1 月 1 日至今所经过的秒数。这在 2038 年就会失效。但是在 64 位的系统中,日期是使用有符号的 64 位整数表示的,这可以极大地扩充其可用范围。 总之,64 位具有以下优点:
不幸的是,C 编程语言并没有提供一种机制来添加新的基本数据类型。因此,提供 64 位的寻址和整数运算能力必须要修改现有数据类型的绑定或映射,或者向 C 语言中添加新的数据类型。 表 1. 32 位和 64 位数据模型
这 3 个 64 位模型(LP64、LLP64 和 ILP64)之间的区别在于非浮点数据类型。当一个或多个 C 数据类型的宽度从一种模型变换成另外一种模型时,应用程序可能会受到很多方面的影响。这些影响主要可以分为两类:
总之,编译器要按照自然边界对数据类型进行对齐,这意味着编译器会进行 “填充”,从而强制进行这种方式的对齐,就像是在 C 结构和联合中所做的一样。结构或联合的成员是根据最宽的成员进行对齐的。清单 1 对这个结构进行了解释。 清单 1. C 结构
表 2 给出了这个结构中每个成员的大小,以及这个结构在 32 位系统和 64 位系统上的大小。 表 2. 结构和结构成员的大小
注意,在一个 32 位的系统上,编译器可能并没有对变量
本节介绍如何解决一些常见的问题:
要想让您的代码在 32 位和 64 位系统上都可以工作,请注意以下有关声明的用法:
在 C/C++ 中,表达式是基于结合律、操作符的优先级和一组数学计算规则的。要想让表达式在 32 位和 64 位系统上都可以正确工作,请注意以下规则:
由于指针、int 和 long 在 64 位系统上大小不再相同了,因此根据这些变量是如何赋值和在应用程序中使用的,可能会出现问题。下面是有关赋值的一些技巧:
16 进制的常量通常都用作掩码或特殊位的值。如果一个没有后缀的 16 进制的常量是 32 位的,并且其高位被置位了,那么它就可以作为无符号整型进行定义。 例如,常数 OxFFFFFFFFL 是一个有符号的 long 类型。在 32 位系统上,这会将所有位都置位(每位全为 1),但是在 64 位系统上,只有低 32 位被置位了,结果是这个值是 0x00000000FFFFFFFF。 如果我们希望所有位全部置位,那么一种可移植的方法是定义一个有符号的常数,其值为 -1。这会将所有位全部置位,因为它采用了二进制补码算法。
可能产生的另外一个问题是最高位的设置。在 32 位系统上,我们使用的是常量 0x80000000。但是可移植性更好的方法是使用一个位移表达式:
Endianism 是指用来存储数据的方法,它定义了整数和浮点数据类型中是如何对字节进行寻址的。 Little-endian 是将低位字节存储在内存的低地址中,将高位字节存储在内存的高地址中。 Big-endian 是将高位字节存储在内存的低地址中,将低位字节存储在内存的高地址中。 表 3 给出了一个 64 位长整数的布局示例。 表 3. 64 位 long int 类型的布局
例如,32 位的字 0x12345678 在 big endian 机器上的布局如下: 表 4. 0x12345678 在 big-endian 系统上的布局
如果将 0x12345678 当作两个半字来看待,分别是 0x1234 和 0x5678,那么就会看到在 big endian 机器上是下面的情况: 表 5. 0x12345678 在 big-endian 系统上当作两个半字来看待的情况
然而,在 little endian 机器上,字 0x12345678 的布局如下所示: 表 6. 0x12345678 在 little-endian 系统上的布局
类似地,两个半字 0x1234 和 0x5678 如下所示: 表 7. 0x12345678 在 little-endian 系统上作为两个半字看到的情况
下面这个例子解释了 big endian 和 little endian 机器上字节顺序之间的区别。 下面的 C 程序在一台 big endian 机器上进行编译和运行时会打印 “Big endian”,在一台 little endian 机器上进行编译和运行时会打印 “Little endian”。 清单 2. big endian 与 little endian
Endianism 在以下情况中非常重要:
在 C 和 C++ 中有位域来帮助处理 endian 的问题。我建议使用位域,而不要使用掩码域或 16 进制的常量。有几个函数可以用来将 16 位和 32 位数据从 “主机字节顺序” 转换成 “网络字节顺序”。例如,
建议您不要使用 C/C++ 中那些在 64 位系统上会改变大小的数据类型来编写应用程序,而是使用一些类型定义或宏来显式地说明变量中所包含的数据的大小和类型。有些定义可以使代码的可移植性更好。
例 1: 在下面这条语句中,在对
解决方案是使用
例 2: 在 32 位系统上,int 和 long 大小相同。由于这一点,有些开发人员会交换使用这两种类型。这可能会导致指针被赋值给 int 类型,或者反之。但是在 64 位的系统上,将指针赋值给 int 类型会导致截断高 32 位的值。 解决方案是将指针作为指针类型或为此而定义的特殊类型进行存储,例如 无类型的整数常量就是 (unsigned) int 类型的。这可能会导致在位移时出现被截断的问题。 例如,在下面的代码中,
要在 64 位系统上进行位移,应该使用
函数 类似地,当一个小整数(char、short、int)被传递给
上面的代码在 64 位系统上会失败,它只会显示低 4 字节的内容。 这个问题的解决方案是使用
在向函数传递参数时需要记住几件事情:
在将有符号整型和无符号整型的和作为 long 类型传递时就会出现问题。考虑下面的情况: 清单 3. 将有符号整型和无符号整型的和作为 long 类型传递
上面这段代码在 64 位系统上会失败,因为表达式 在基于寄存器的系统上还有一个问题:系统采用寄存器而不是堆栈来向函数传递参数。考虑下面的例子:
在基于堆栈的系统中,这会打印对应的 16 进制值。但是在基于寄存器的系统中,这个 16 进制的值会从一个整数寄存器中读取,而不是从浮点寄存器中读取。 解决方案是将浮点变量的地址强制转换成一个指向整型类型的指针,如下所示:
主流的硬件供应商最近都在扩充自己的 64 位产品,这是因为 64 位平台可以提供更好的性能、价值和可伸缩性。32 位系统的限制,特别是 4GB 的虚拟内存上限,已经极大地刺激很多公司开始考虑迁移到 64 位平台上。了解如何将应用程序移植到 64 位体系结构上可以帮助我们编写可移植性更好且效率更高的代码。 学习
获得产品和技术
讨论
|
发表评论
-
ubuntu9.04 字体安装两种方法
2011-01-07 23:02 1121ubuntu9.04 字体安装两种方法 ... -
Linux常用定位/显示命令
2010-08-28 23:31 6899Linux常用定位/显示命令 2009年12月30日, 5 ... -
如何在Ubuntu上安装GIT
2010-08-04 19:51 7782如何在Ubuntu上安装GIT <!--oogle ... -
虚拟机VMware安装ubuntu以及安装vmtools
2010-08-02 11:35 3850虚拟机软件可在一台计算机(这台计算机成为宿主计算机)上模拟出 ... -
unbuntu8.04 系统安装 分区置
2010-07-22 10:34 2093unbuntu8.04 系统安装 分区 ... -
Linux find命令详解
2010-07-07 15:45 1129由于find具有 ... -
linux根目录
2008-12-12 21:05 3755linux根目录说明2008-11-18 ... -
Linux. Vi编辑器
2008-12-05 12:29 1479Linux. Vi编辑器的基本使用方法 vi编辑器是所有Uni ...
相关推荐
Linux应用程序移植到VxWorks的方法研究.pdf
如果不是,那么本文将给您些提示和技巧,在您把应用程序移植到 Linux 的时候为您提供指导。本文首先为大家描述 Linux 的特征和它在开发和管理应用程序中的具体价值。然后将回顾重要问题,给出包含移植的主要步骤的...
当从 OS/2 移植到 Linux 时,关键的编程问题是什么?本文为大家介绍将OS/2应用程序移植到Linux操作系统的方法。
将 Linux 应用程序移植到 VSF
本文将主要阐述将已有驱动程序、开发系统、应用软件和定制Linux配置移植到2.6内核的方法步骤。
本课题任务是移植安装Linux操作系统,开发LED或蜂鸣器报警应用设备的驱动程序及其应用程序。要求完成的任务和实现的功能有: (1) 以FS4412开发板为开发平台,移植Linux操作系统,含引导程序、Linux操作系统内核、...
适用于Vxworks平台到Linux平台的嵌入式研发
Linux应用程序向WindowsCE平台移植的研究与实现
在 Linux 操作系统移植任务中,充分研究了驱动程序和底层 IP 核的关系,基于 V4L2 框架完成了视频处理 IP 核驱动程序开发,通过视频 IP 核的优化处理,完成了 RGB 格式高清图像采集与显示。在应用层采用软硬件协同...
将 Win32 C_C++ 应用程序迁移到 POWER 上的 Linux,第 1 部分_ 进程、线程和共享内存服务。对比windows、linux进程、线程、共享内存的API。
用Kylix实现Windows应用程序到Linux平台的移植.pdf
另外,《Linux系统移植(第2版)》赠送17.5小时多媒体教学视频及书中涉及的实例源程序,便于读者高效、直观地学习。 《Linux系统移植(第2版)》分为4篇。第1篇简单介绍了Linux内核和嵌入式Linux系统开发环境搭建...
接着系统地讲解了嵌入式Linux的环境搭建,以及嵌入式Linux的I/O与文件系统的开发、进程控制开发、进程间通信开发、网络应用开发、基于中断的开发、设备驱动程序的开发以及嵌入式图形界面的开发等,并且还安排了丰富...
应用实例的编写实际上已经不属于Linux操作系统移植的范畴,但是为了保证本系列文章的完整性,这里提供一系列针对嵌入式Linux开发应用程序的实例。
Linux系统的移植 介绍: 硬件环境,软件环境,配置系统服务 GNU交叉工具链 系统启动bootloader的编写 应用程序的移植 Cs8900a网卡驱动的编写与移植
Linux嵌入式系统移植。包括linux嵌入式开发环境的构建,Uboot移植,根文件系统移植,应用程序开发。
应用程序的移植是一项系统与系统之间,系统与应用程序兼容性的解决,因此,对于成功移植的定义绝对不只是...执行相应的测试方案,考查应用程序与linux系统的兼容性,并进行移植后处理也是应用程序移植的一个重要内容。
前段时间一直在做openCapwap的移植和调试工作,现在工作已接近尾声,编写本文档对前段工作进行一个总结,分享下... 在安装有Linux操作系统的PC上安装对于平台的交叉编译器,并将交叉编译器加到环境变量中,如expor
它对于移植RTOS 代码到规范化模式的Linux设备启动程序具有启发性,并且介绍了一些方法。特别地,本文会重点讨论和比较RTOS代码中的内存映射,Linux基于 I/O调度队列的移植,和重新定义RTOS I/O,以便在本地Linux ...
《嵌入式Linux应用程序开发标准教程(第2版)》主要分为3个部分,包括Linux基础、搭建嵌入式Linux环境和嵌入式Linux的应用开发。Linux基础部分从Linux基础、基本操作命令讲起,为Linux初学者能快速入门提供了保证。...