Raspbian移至64位模式


52

此页面中,RPi3官方公告指出:

您需要从我们的下载页面上获得最近的NOOBS或Raspbian映像。在启动时,我们使用的是与其他Raspberry Pi设备相同的32位Raspbian用户区。在接下来的几个月中,我们将调查转向64位模式是否有价值。

我的问题是,因为该处理器是64位的,是不是很明显的是在运行64位操作系统将在各方面都好?我想念什么?


9
我曾经在一家将DEC / Alpha上的软件从32位移植到64位OSF的公司工作(很久以前)。由于代码库已经符合64位标准,因此可以直接进行重新编译。整数和指针会增加内存消耗,从而降低10%的性能。那时回溯到以三位数的兆赫兹和两位(也许是低三位数)内存衡量性能的时代。如果没有板载4GB以上的RAM,则不一定是个好主意。
克里斯K

6
与Pi相比,首先使用64位将获得更大的内存。
托尔比约恩Ravn的安徒生

2
在基于x86的系统上,很难决定是否采用混合abi:en.wikipedia.org/wiki/X32_ABI,它使用32位指针和64位cpu寄存器。
PlasmaHH 2016年

1
@ChrisKaminski,但ARM和x86不同。当它们从32位变为64位时,它们会使寄存器数量加倍,并重新设计了指令集的某些方面,从而使代码在大多数情况下运行得更快。您可以在互联网上看到很多基准测试
phuclv

@rsaxvc那么,这对我的评论有什么影响?我说“ ARM x86”的意思是,在那些体系结构中,使用64位可以提高应用程序的性能,而与其他体系结构(例如DEC / Alpha或Sparc,MIPS
。– phuclv

Answers:


62

假设处理器是64位的,那么以64位运行OS在各个方面是否会更好会明显吗?

不,实际上不是。在某些方面,运行64位操作系统可能会使Raspberry Pi的性能下降。

64位的好处

使用64位处理器/操作系统的两个主要好处是,该设备可以处理4 GB以上的RAM,并且本地处理的整数大于2^32不需要bignum库的整数。

Raspberry Pi的RAM不超过4 GB。在1 GB的RAM上,您已经完全失去了两个主要好处中的第一个。至于第二个好处,实际上有多少百分比的人使用了足够大的数字以使基金会能够支持整个第二个操作系统?照原样,RPi可以通过软件方法使用大量软件,但是如果您要在那个领域保持一致,则无论如何都需要使用更好的硬件。

问题与64位

魔术并不授予存储更大数量数字的能力。而是,需要增加存储对象的大小。在C(和C ++)中,这意味着将更int改为int64_t。这不会自动完成,因此有关基础的注释不希望维护两个分支。

此外,在64位模式下运行时,许多应用程序(对于大多数用户)根本无法提供任何好处。请注意,大多数Web浏览器,MS Office和大量其他流行软件仍以32位的方式提供和维护。当然,您可以使用64位版本的MS Office,但很少使用。

如果编写应用程序/操作系统以利用64位体系结构,则您的应用程序将使用更多的内存,仅仅是因为变量和指针占用了更多的空间。通常,对于要从特权中受益的机器来说,这是一个相对较小的折衷。在我们的情况下,我们的特权很少,而RAM却很少。

还要注意

仅仅因为您在64位计算机上运行,​​并不意味着该应用程序未以32位运行。Windows通过具有两个不同的安装路径C:\Program Files和来使这一点非常清楚C:\Program Files (x86)

那么,基金会可能会提供64位支持吗?

我们回到了同一点,“有些人可能会看到好处,但大多数人不会。” 您肯定会看到其他提供64位构建的项目,但是除非基金会获得很多不当(imo)缺陷,否则它们可能不会也不应(imo)。创建和维护一个单独的64位分支并不是一件容易的事,老实说,这似乎并不值得。


7
假设您谈论C和朋友,则任何类型<= int的大小都保持不变。在Linux的地址模型下,size_t和指针的大小会增加。您还完全错过了虚拟地址空间,这在执行内存映射的I / O时很重要。

3
区分物理内存量和虚拟内存并不先进。它也不会传播错误信息。sizeof(char)永远是一。在Linux下,sizeof(short)sizeof(int)sizeof(float)sizeof(double)与位数不变化。那在你的主张上有很大的不同。

11
x64在此答案中的使用存在问题。x64是的缩写x86-64。这不是 “ 64位”的同义词。64位ARM CPU是AArch64
奥利


3
您错过了迁移到64位OS的最大原因。2038年1月19日。32位Linux无法处理该时间之后的日期。该修复程序已经在相当长的一段时间内针对64位Linux(并基于32位Unix时间升级任何软件)。现在距离2038年已经有20年了,但是作为小型嵌入式计算机的Raspberry Pi在将来的远景中仍具有一定的潜力。在1980年,也没有人真正重视Y2K问题。
史蒂夫·瑟尔

19

值得注意的是,ARM和Intel / AMD的情况有所不同。那是因为切换到x86_64还被用作更新严重老化的体系结构的机会,该体系结构由于只有8个通用寄存器而受到严重破坏,并且在64位模式下增加了一倍。因此,将Intel / AMD系统切换到64位模式还意味着启用真正的功能,这些功能在性能上有很大的不同。

ARM根本没有这个问题(尽管AArch64增加了寄存器,但32位体系结构并没有饿死),所以好处基本上是直接寻址的内存和本地大整数支持-少了很多交易,并且可能被不利因素抵消(更多的内存用于所有操作)。

(此外,由于这个原因,在为Intel / AMD Linux创建“ x32” abi方面做了一些工作,保留了CPU增强功能,但使用了32位指针。)


5
尽管AArch32已经比x86拥有更多的寄存器,但AArch64却做得更好,因为现在有单独的SP和PC。在您最多拥有14个通用寄存器之前。你也有一个更好的设计的指令集有没有性能优势ARM6464位ARM(Aarch64)指令由15%至30%提高性能相较于32位ARM(Aarch32)指令
phuclv


看到Pi3上的基准测试(特别是在实际任务中)会很有趣。
mattdm

6

我确定在Pi 3上已经有运行Debian Aarch64(ARMv8)的人了。它肯定不会那么难了很多人(在这里看到了一些端倪有关可能的工作)1虽然对于大多数用户来说可能是有点夸张。

但是,如果Raspbian和/或Foundation没有提供64位版本,您将越来越多地看到博客等人,向他们说明如何运行它并仍然获得所需的东西。


Pi 3 现在有一个Fedora aarch64版本


1. 32位的/opt/vc东西会有一些麻烦,我不确定那是多么可克服。曾经有x86-64的32位compat库,但Aarch64 ...也许不是。


1
raspbian.org/RaspbianFAQ#What_is_Raspbian.3F指出(谈论Raspbian):该端口是必需的,因为Debian官方的armef官方发行版仅与ARM体系结构的版本兼容,而不是与Raspberry Pi(ARMv7-A CPU)上使用的版本兼容。以及更高版本,而不是Raspberry Pi的ARMv6 CPU)。RPi3仍然适用吗?
zundi

@sandy我认为那是1)比较古老;2)此后感到困惑和/或未纠正,因为Debian armhf是使用硬浮点编译的,所以这就是hf的作用,而还有另一个ARMv4 / 5的debian,我认为这是第一个在Linux上使用的,而ISA没有具有强浮点数(我认为6直到某一点都没有,但是在大多数时候都是这样,又名ARM1176JZ(F)-S)。因此,有只有一个版本Raspbian,周期的ARMv6的硬件浮点支持,A / B / + / 0模型和2之间唯一的区别时,想必这样还与3内核
金发姑娘

2
...“ armel”是Raspbian之前使用的非hf Debian。
goldilocks

@sandy,情感是在pi1的日子里写的,所以当它说pi时,意味着我们现在将其称为pi1。有第三方发布pi2(以及预先推荐的pi3)的debian armhf图像,但是rpf决定暂时在所有主板上使用一个图像。
彼得·格林

5

作为发布宣传的一部分,我看到它提到的一个问题是维护两个单独的代码库(32位和64位)需要付出的努力。Adafruit PI3 Launch视频还提到,迁移到64位处理器更多地是关于新芯片提供的时钟速度增加,而不是使用64位模式。


我以为代码是相同的,但是编译器将负责优化最终代码以利用该体系结构。进行新构建相对容易吗?说,要以64位元运行Debian吗?
zundi

@sandy Easy将取决于您的技能水平和经验。现在需要什么用例?
史蒂夫·罗比拉德

没有特别的要求,只是想最大限度地发挥RPi3的性能。
zundi

@sandy基金会表示,取代Pi3的速度不会像跟随Pi2的Pi3一样快(大约1年)。他们可能会使用切换到64位的方式来提高性能,而无需新的硬件-请注意,这全都是我的猜测。
史蒂夫·罗比拉德

4

即使您的内存不足1GB,也可以使用64位寻址。

它允许您对大型文件进行内存映射,因此您有了一个指针,并让OS透明地执行I / O。这是执行I / O的另一种方式。您需要64位寻址才能对大型文件执行此操作。

我认为它有用的另一个示例是,使用交换空间允许进程拥有超过2GB的地址空间。我最近在具有大量存储空间和损坏的文件系统的32位NAS上遇到问题。即使打开了缓存选项,fsck进程也会用完内存。添加交换空间不能解决问题,那里的32位地址空间是硬限制。因此,没有办法在带有32位二进制文​​件的损坏较大的文件系统上运行fsck。如果使用64位二进制文​​件和一些交换空间,它将可以运行。


3

解决了这样的断言:64位本机程序更大(用于数据和指针的更多内存),并且对于RAMv小于4GB的ARMv8上的64位和32位OS没有明显的好处,我希望提出一些建议。点。

在体系结构上,ARMv7(及之前)和ARMv8在处理方式上存在一些显着差异,这些差异使ARMv8的执行效率更高。其中一些来自更广泛的内部数据路径,一些来自特殊情况的消除,以及更深层次的管道)。这些相同的更改使ARMv8更好地运行ARMv7(32位)代码。

本机64位应用程序确实使用64位指针,而'size_t'是64位,因此使用这些指针的元素的确会更大。其余数据将趋于保持相同大小。但是,这对于可执行映像的大小意义不大。

64位本机真正发挥作用的地方(如果您不关心大整数和浮点数)是具有更大的虚拟地址空间的:

  • 操作系统能够将虚拟地址空间划分为更多和更大的部分,从而可以更轻松地管理共享资源,在不同特权级别之间进行更简化的上下文切换,等等。
  • 如果启用了交换功能,则可以运行更多和更大的进程,超过了物理内存限制(实际上在32位中也是如此,但在64位中的限制较少)

无论操作系统当前是否利用了这一优势,随着主流逐渐从32位移开,它将有所作为。

我认为,移植到本地64位AArch64内核的最佳论据是可移植性:主流台式机已移至大多数64位处理器,并且我看到更多采用64位的软件包,而将此类代码移植回32位则更加困难。从32位移植到64位 在用户空间中,假设您已经安装了多体系结构库,则能够并行运行32位应用程序和64位应用程序,因此不需要将32位应用程序移植到64位物。64位操作系统只会为您提供更多的软件选择。

我并不是说要为Raspberry PI 3生成64位内核很容易-存在重大差异,需要在底层进行更改,并非所有设备驱动程序都是64位干净的(尤其是ARM特定GPU的驱动程序)。Raspberian可能仍将是32位操作系统,但我认为(从长远来看)它是短视的。

单个引导媒体(例如SD卡)可以包含64位和32位版本的OS,而辅助引导软件(u-boot,arm-boot和其他引导软件)可以确定要加载哪个。更难的部分是用户空间-文件系统必须是多体系结构,即使在32位系统上,如果64位的东西将无用。我将使用脚本或实用程序来解决此问题,该脚本或实用程序可在初次启动后运行,以删除仅32位系统上不需要的库和程序可执行文件。


也许我们需要用于ARM的x32 ABI。然后我们可以有小的指针和所有的寄存器。
rsaxvc '16

2

现有的答案很好地解决了64位拱门的问题,但是我没有看到许多明显的升级优势。所以,这是我最近发现的两个:

  • 当PHP处理Unix时间戳时,32位拱形中的整数大小会设置日期上限,以使日期不能超过2038年的特定日期。我希望这是所有处理时间戳的语言的问题。(值得庆幸的是,大多数不使用Unix时间戳的日期处理子系统,例如PHP的DateTime,都是经过专门设计的,即使在较旧的CPU上也不受此问题的限制)。
  • Mongo在此拱门上仅限于2G以下的数据库,并且很快将弃用32位版本。从手册

    从MongoDB 3.2开始,不赞成使用32位二进制文​​件,并且在将来的版本中将不可用。

    尽管32位版本适用于Linux和Windows,但它们不适用于生产部署。32位版本也不支持WiredTiger存储引擎。


奇怪的是,这取决于您的平台。它通常不是整数大小,而是“ C”库中time_t的大小。即使在32位平台上,也可以使用带有CPU时间开销的64位time_t,但是许多32位平台仍未这样做,因为这样做存在二进制兼容性问题。
rsaxvc '16

@rsaxvc,有趣,谢谢。那么我是否可以通过重新编译PHP获得64位时间处理,还是需要修改底层C库?前者将在我的能力范围内,但我不确定后者-我也正在考虑重新编译整个Ras [bian],但似乎没有任何简单的说明(反正)。
2016年

对于Linux,您需要修补内核,libc和应用程序。这可能不值得。经过一番读后,OpenBSD(在RPi上没有)time_t从5.5开始是64位的。在使用Visual Studio 2005或更高版本的32位Windows上,time_t为64位。
rsaxvc

@rsaxvc:好的,谢谢。我不知道这是有道理的,我等待64位操作系统可用-它听起来从几个月前的几个新闻文章迫在眉睫....:-)
halfer

-4

我的想法是:尽管我不确切知道ARM处理器如何寻址内存,但是我可以从我以前在(SPARC / Alpha / i386 / AMD64 / X86_64)上编程过的多个CPU体系结构中告诉您:使用共享内存和寻址时通过其“真实”虚拟地址指针,转移到64位并非易事。尽管memcpy可以完成预期的工作,但您需要考虑的是,数据以64位这样存储(向后存储):

HGFEDCBA
HGFEDCBA
HGFEDCBA

但是在32位中,它看起来像这样:

ABCD
ABCD
ABCD

因此,当您在RAM中存储一个jpeg时,在32位中,您可以读取其标头字节或进行边缘检测,而不会出现任何线性问题,例如通过逐字节向前移动。但是在64位架构中,这会发生变化:

32位:

for (i=0; i< img_length/4; i++) 
{ 
    address=shm_start+i; 
    for (c=0; c< 4; c++) 
    { 
        byte=((*address >> c) & 15) 
    } 
}

64位:

for (i=-; i< img_length/8; i++) 
{ 
    address=shm_start+i; 
    for (c=7; c>=0; c--) 
    { 
        byte=((*address >> c) & 15) 
    } 
}

5
字节序与字长无关。哎呀,许多架构都允许程序员选择字节序,包括ARM!而且,“ 64位”可能会因所讨论的体系结构而产生完全不同的结果,并且很难在各种体系结构之间进行比较或试图在它们之间绘制相似性。
鲍勃

1
我认为我=-是无效的。
rsaxvc
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.