背景
MIPS R10000芯片支持MIPS ABI。遵循这一标准的程序能够运行在遵循这一标准的任何处理器/系统上。
目前,主要的支持者有SGI,西门子,Nixdof, Tandem, Pyramid, Sony和NEC。从1989年开始支持64位,这是这一MIPS产品线比较优秀的一个方面。
第一个支持64位的芯片是R4000,而第一个支持64位的系统是运行在MIPS R8000上的IRIX 6.0,始于1993年。
像SGI之类的系统厂商在兼容性和性能之间作出了平衡。在地址模式,操作系统提供的系统库以及编译器方面,这一点是首要考虑的问题。
因为一旦一个程序被设计,也就会做出支持哪种地址模式的决定。SGI提供了三种模式:O32,N32和N64。
使用这些模式的方法非常简单,开发人员只需要在编译程序时设置合适的编译器开关以及相应的共享库。
O32
来自SGI的O32地址模式符合MIPS ABI标准,从1989年开始使用。在兼容性方面,O32非常成功,并一直作为SGI平台的默认选择。
即使R10000能够支持64位操作,出于兼容性方面的考虑,O32会把它当成32位处理器使用。
这32个位,其中一个被IRIX操作系统保留使用,留给地址使用的是31位。因此,最多可以使用2GB的内存,这就意味着程序和数据不能超过2GB;对于绝大部分应用程序来说,这已经足够了,但,随着内存价格的下降,某些程序会在内存中缓存各大的数据集。
N32
为了保持在处理大数据时的高度的响应能力,现代的应用程序需要更高的运算性能。同时,这个程序被设计成了32位程序。
举个例子,SGI MineSet data visualization程序从数据库或者磁盘文件中将数据读入内存并根据用户需求执行快速的本地操作。
本地访问数据同时又要保持用户响应总比随时远程访问数据要快一些。MineSet使用SGI N32而不是O32 ABI。
因为N32 ABI能够提供大约25%的性能,很多客户选择N32来编写应用程序。除了算法上的提升,因为N32使用了处理器的一部分64位特性,也保证了性能的提升。
因为N32仍然保留了32位模式,很多O32代码只需要重新编译为N32就可以获得性能提升。
实际上,N32对代码的要求比较严格,将基于O32的代码转换为N32代码通常要进行修改,然后才能成功编译。
N32 ABI和O32 ABI并不是二进制兼容的。O32编译的应用程序模块不能链接到N32编译的应用程序模块。整个应用程序必须使用相同的编译设置。
N64
N64是SGI标准64位模式。他允许263位寻址,大概是O32/N32允许的4,000,000,000倍.这远远超过了今天的可行配置,因此N64是为未来准备的架构。
http://blog.chinaunix.net/uid-8698607-id-2455563.html
http://www.cnblogs.com/yorkwoo/p/4709772.html
http://bbs.lemote.com/forum.php?mod=viewthread&tid=72398
龙芯2F处理器GCC 4.4编译优化探秘
http://os.51cto.com/art/200810/94359_all.htm
编译方法:
http://bbs.loongnix.org/forum.php?mod=viewthread&tid=74305