Hi,这里是新鲜好玩儿的腾讯微博,立即登录,新鲜动态尽收眼底!

  • 听众
  • 收听
  • 广播

linux系统的64位和Multilib库的有关常识

2017-05-03

前言

  得益于整个计算机行业的64位系统化,许多软件在64位的支持上都得到了改善,现在x86上64位的桌面系统已经是普遍存在的了。就连龙芯CPU也已经较好支持64位Linux系统了。这次我们就以64位的Loongson3/MIPS64 系统为例聊聊关于64位的一些常识。



关于Loongson(MIPS)64位

  简单的介绍一下Loongson的指令集和abi:

  指令集:mips1、mips2、mips3、mips4、mips32、mips32r2、mips64、mips64r2等

  abi:O32、N32、64等

  指令集主要是包含了各种操作指令实现的约定,而ABI这主要是规定了程序各方面调用的约定,如寄存器的使用。

  我们这里指的64位系统通常是指ABI=64的情况,当然我们使用的指令集也使用了mips64r2,但即使ABI=O32也是同样可以使用mips64(r2)指令的,另一个64位系统的主要特征是,位于/bin或者/lib(32,64)之类目录下的可执行文件或者库文件是使用ELF64的格式,而32位的系统是ELF32。

  关于64 ABI相关的内容可以参考Heiher的一篇文章:https://hev.cc/2570.html
  另外有个问题要能回答清楚还是不容易的,那就是“用Loongson/MIPS 64位究竟有什么好处?”,这个问题其实我回答的不好,但还是尝试的回答一下。

  我觉得64位指令集最主要的一点就是有大量使用64位长的指令,这些指令相比32位长可以同时处理的数据量多了一倍,如果指令执行的周期一样的情况下,那么处理数据的性能可以提高一倍,当然这个是理论上的,而目前大量的程序设计的时候并没有充分使用64位长优势,所以同样的程序在编译为64位的可执行文件后并没有提高执行效率,反而由于64位的程序文件会比32位的大一些,甚至会出现64位的程序执行的比32位程序更慢。

  另外,我们再看一个简单的程序,代码如下:
 #include
 int main()
 {
        printf("char:%d\n", sizeof(char));
        printf("short:%d\n", sizeof(short));
        printf("int:%d\n", sizeof(int));
        printf("long:%d\n", sizeof(long));
        printf("long long:%d\n", sizeof(long long));
        printf("float:%d\n", sizeof(float));
        printf("double:%d\n", sizeof(double));
        printf("void *:%d\n", sizeof(void *));
        return 0;
 }

  这是一段查看不同变量类型长度的程序,使用32位编译后的运行结果为:

 char:1
 short:2
 int:4
 long:4
 long long:8
 float:4
 double:8
 void *:4

  64位的编译执行后的结果为:

 char:1
 short:2
 int:4
 long:8
 long long:8
 float:4
 double:8
 void *:8

  可以看出,有两种变量类型的尺寸是不一样的:long和指针类型(void *),所以软件程序如果使用这两种类型的变量就要注意有可能存在代码兼容性的问题,所以有时候32位编译运行正常的程序不一定编译为64位程序还可以正常运行。

  以上说明软件从32位到64位并不是想当然的提高了性能,不但存在降低执行性能的可能,而且还有代码兼容的问题,但我不是想说64位没有了优势,只是目前很多软件还没有发挥64位的优势,所以大家要能够理解目前一些程序执行效率并没有提高的事实。

  那我们这个64位系统的意义在哪里?

  首先,在现在的很多图形图像处理中,或者一些软件中会使用大量的浮点运算,而浮点运算多数都是64位、128位,甚至更高位数的计算,这个时候64位的指令处理能力就被发挥出来了,因此64位系统明显会在一些大量浮点运算的软件中提升优势,这点可以通过spec的浮点运算性能相关的用例测试数据中看出来。

  再将眼光放长远一些,当64位成为主流的时候,大量软件的64位优化将使软件的执行效率提高,这会成为趋势。


  所以,目前的Fedora 21 for Loongson也许在某些软件的执行效率上未必比现在32位的系统上运行的更快,甚至还会慢一些,但至少64位为软件的提速提供了空间。

关于Multilib

  正如上面的篇幅介绍的,64位和32位是存在兼容性的问题,所以32位程序和64位程序并不能共享同一段代码,因此也不能共享同一个库文件,Linux系统用一个粗匡的方式描述一个程序执行的需要就是:

    内核+可执行程序

  现在多数Linux系统都会使用共享库的方式来把通用的代码提取出来,那么就变成:

    内核+共享库+可执行程序

  目前来说Linux作为内核可以提供32位和64位的兼容支持,因为目前一个系统还是同一时刻只有一个跟自己相关的内核在运行,而共享库目前还没有做到同一个文件同时兼容32位和64位,那么如果一个64位的系统中我还想运行一些32位的程序时该如何呢?

    方法1:直接编译一个不依赖任何共享库的执行文件;

    方法2:在其它32位的Linux系统上编译一个静态的执行文件,该方法原理同方法1;

    方法3:在64位系统中想办法同时提供64位和32位的共享库,运行32位程序的时候就使用32位的共享库,这个方法我们就成为“Multilib”。


  Fedora 21 for Loongson采用的就是Multilib的方案,我们在Linux系统中加入了大量的32位共享库,目前已提供了能支持32位程序能使用基本的图形库的要求,如GTK+、QT等。

  MIPS除了32和64的ABI外,还支持一种叫做N32的ABI,它的类型长度同32位一样,但程序对寄存器调用的规范却和64位相同,所以在某些情况下N32有自己的优势,但目前使用的并不多。

  Fedora 21 for Loongson 首次将3中ABI的Mutilib方案支持程度提高到图形环境下。


  综上所述,为什么称呼Fedora 21 for Loongson叫做64位系统呢?

  最主要的原因是,几乎Fedora 21 for Loongson编译的软件都带有64位执行文件,而32和N32的软件包目前只支持到基本的图形系统,总的来说系统是靠64位软件支撑运行的,32和N32支持软件的范围目前是一致的。


  关于32和N32软件支持程度这里也可以说明一下,支持32位的软件更多的是位了能使用第3方以前基于32位Linux系统开发的软件,以及当前还无法运行在64位下的软件而提供的必要迟迟,我们根据目前在Loongson平台上主要的Linux操作系统涉及到的第3方软件,当前32位支持到基础图形库就基本满足绝大多数32位第3方软件的运行,而大量自带的软件因为已经有了64位的软件包则无需再提供32位的版本。


  Fedora 21 for Loonson提供的Multilib是在Loongson平台上第一次提供的真正意义上的Multilib,之前声称提供Multilib的多数情况只提供了GLibc的支持,几乎没有用处,要说明我们这个Multilib的现实和实际作用,我们来举个例子:当前支持Loongson的Flash播放插件只有32位版本,并且无法得到源代码进行修改或者重新编译,要在64位的软件环境下使用就要在我们提供了大量的Multilib库后,这个32位的插件可以运行在64位的系统中了,所以Fedora 21 for Loongson是第一个也是目前唯一在Loongson平台上可以在64位系统中使用Flash插件的系统。

总结

  本次特性介绍中的两点是相互关联的,64位系统目前运行效率不一定比32位的系统高,但我们为将来提升软件性能提供了有效的平台,并且目前在浮点类相关的软件已经可以获得相当的性能优势;在朝着64位发展方向进发的同时我们也不能放弃当前32位的现实需求,在此基础上我们实现了一个真正有意义的Multilib环境,保证当前的应用可以很好的在Fedora 21 for Loongson上运行。
 
本文转载自 [龙芯梦兰网站],原文地址为  http://dev.lemote.com/wiki/index.php?title=Fedor_21_for_Loongson3_%E2%80%94%E2%80%94_64%E4%BD%8D%E5%92%8CMultilib       

正在加载...