Linux kernel 3.4的X32 ABI介绍
Linux kernel 3.4的更新介绍在这:http://kernelnewbies.org/Linux_3.4,看我们关注的重点内容:1.3. New X32 ABI: 64-bit mode with 32-bit pointers。
我们知道X86_64的最大优势之一就是提供了更大的内存地址空间,这对于现在如此廉价的物理内存的使用来说,X86_64系统就是一个非常好的诱惑;但是,有利也有弊,同样的代码,编译得到的64位程序无疑要比32位程序要大;这很容易理解,比如64位程序的一个指针变量要占去8个字节,而32位程序的一个指针变量却只需4个字节;一般人不会太过关注这个差别,除非是从底层上去特别在意性能的程序员。
从底层视角来看,与性能相关最大的因素就是CPU cache,我曾提到过E5520 CPU的一个逻辑核只有64KB的一级cache,在如此宝贵的缓存空间里,64位与32位程序指针变量前后相差一倍大小的影响自然不可忽视;但就此而抛弃64位技术(比如以兼容模式执行32位程序)又是万万不能的,因为前面就说过,64位技术提供了更大的内存地址空间,除此之外,还有更多更大的寄存器(比如新增8个通用寄存器)、更快的函数参数传递(前6个INTEGER类型的参数通过寄存器进行传递)、更快的浮点运算、更快的SYSCALL64等等。
闲话少说入正题,一般来讲,Linux 64位与32位应用程序的最基本不同在于它们各自的数据类型模型上的差别:Linux 32位应用程序的数据类型模型是ILP32(表示在该数据类型模型下,int、long、pointer,这三种类型的长度为32bit;非常好记,取这三种类型的第一个字母大写再加上32就是ILP32),而Linux 64位应用程序的数据类型模型是LP64(即在该数据类型模型下,long、pointer,这两种类型的长度为64bit,取这两种类型的第一个字母大写再加上64就是LP64)。而X32 AIB是这样一种技术,简单点说,它能让64位应用程序保留64位技术的所有特征,除了将其数据类型模型保留为与32位一致,即从LP64变回ILP32。可以看到,这是一种取舍的权衡,32位与4位两种优势的糅合。如果64位系统上的一个应用程序并不需要超过4G的地址空间,那么X32 ABI是让它以最有效方式运行的手段之一。
要使用X32 ABI,需要支撑的东西比较多,首先是内核,因为应用程序会经常调入到内核里,如果不是双方可知的ABI,程序肯定会跑飞;编译器、调试器以及支撑库等一套编译环境(比如gcc、glibc、gdb等)也是必要的,等等,具体请参考:http://sites.google.com/site/x32abi
转载请保留地址:http://lenky.info/archives/2012/07/18/1817 或 http://lenky.info/?p=1817
备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。
法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以或书面等方式告知,本站将及时删除相关内容或链接。