C程序员的ARM体系结构之间的差异';谁的观点?

C程序员的ARM体系结构之间的差异';谁的观点?,c,architecture,arm,instruction-set,C,Architecture,Arm,Instruction Set,我对ARM编程相当陌生。我注意到有几种架构,如ARMv4、ARMv5、ARMv6等。它们之间的区别是什么?他们有不同的指令集或行为吗 最重要的是,如果我为ARMv6编译一些C代码,它会在ARMv5上运行吗?在ARMv6上运行的ARMv5代码呢?或者,如果我编写内核汇编代码,我只需要担心差异吗?ARM本身是相当兼容的,只要您坚持使用用户代码(内核代码当然是不同的)。在托管操作系统环境中,您可能会坚持使用ARMv5(ARM926处理器) 最大的区别来自: 缓存行为大不相同。某些ARM上的缓存甚至是虚

我对ARM编程相当陌生。我注意到有几种架构,如ARMv4、ARMv5、ARMv6等。它们之间的区别是什么?他们有不同的指令集或行为吗


最重要的是,如果我为ARMv6编译一些C代码,它会在ARMv5上运行吗?在ARMv6上运行的ARMv5代码呢?或者,如果我编写内核汇编代码,我只需要担心差异吗?

ARM本身是相当兼容的,只要您坚持使用用户代码(内核代码当然是不同的)。在托管操作系统环境中,您可能会坚持使用ARMv5(ARM926处理器)

最大的区别来自:

  • 缓存行为大不相同。某些ARM上的缓存甚至是虚拟寻址的,这会使进程切换变得痛苦
  • FPU有几种风格(VFP、霓虹灯等!)。许多较小的处理器甚至没有FPU
  • 拇指模式发生了巨大的变化。ARMv5之间的Thumb模式不可移植到Thumb2(ARMv6+),也不向后兼容
    如果差异对您来说真的那么重要,您应该能够从ARM的公共文档中找到它


    但是,用更高级的语言(即使它只和C一样“高”)写作的全部目的是不必担心它。您所要做的就是重新编译。即使在内核中,也不需要在汇编中编写太多代码;当你确实需要在汇编中编写一些东西时(即,不仅仅是为了获得最高性能),这通常不仅仅是因为CPU的选择(例如,什么被直接映射到了哪里?)。

    想象一下ARM与ARM的对比,比如wintel计算机与intel mac。假设两台计算机上都有相同的英特尔芯片(系列),那么部分C代码可以一次性编译并在两个处理器上正常运行。程序变化的位置和原因与英特尔处理器无关,而与处理器周围的芯片和主板以及本例中的操作系统有关

    ARM与ARM之间的大多数差异不是核心,而是围绕核心的特定于供应商的逻辑。所以这是一个复杂的问题,如果您的C代码是一些调用标准api调用的应用程序,那么它应该在arm、intel、powerpc或其他任何平台上编译。如果您的应用程序开始与片上或板上外围设备进行通信,那么无论处理器类型是什么,一块板、一块芯片都会有所不同,因此必须为该芯片或主板编写C代码。如果您为ARMv6编译二进制文件,它可以并且将在ARMv4上具有被视为未定义的指令,并将导致异常。如果您为ARMv4编译,ARMv6应该可以正常运行

    充其量,如果您在这个应用程序空间中,那么您可能会看到的只是性能差异。其中一些与您在编译器选项中的选择有关。有时您可以帮助编写代码。我建议尽可能避免除法和浮点运算。我不喜欢乘法,但如果按一下,我会用乘法代替除法。x86让我们被未对齐的访问搞得一团糟,如果你现在开始使用对齐的I/O,那么当你进入其他也喜欢对齐访问的芯片时,或者你会被各种was操作系统和引导加载程序配置ARM以做出反应,而这些都不是你在x86上习惯的。同样,保持这个习惯,您的x86代码将运行得更快

    获取一份ARM的副本(谷歌:ARM架构参考手册,你可以在很多地方免费下载,我不知道当前版本是什么,版本I或者其他什么)。浏览ARM指令集,可以看到大多数指令在所有内核上都受支持,有些指令是随着时间的推移而添加的,如divide和byteswap等。你会看到核心之间没有什么可怕的

    从系统的角度考虑,wintel与intel mac的竞争。ARM不生产芯片,他们生产并授权核心。大多数在芯片中使用ARM的厂商都有自己的特殊调味汁。因此,就像WiTeleVS和MAC一样,中间的处理器是一样的,但是在处理器触摸和使用的所有东西上都是完全不同的。它不会停止于ARM内核,ARM销售外设、浮点单元、缓存等。例如,如果任何ARMV4都是相同的,那么它就很少了。如果你的代码触及了这些差异,那么你就会遇到问题


    除了arm之外,芯片的arm部分还有TRM(技术参考手册)。但是,如果您使用的组件的trm错误,可能会让您头痛。TRM可能有注册描述和其他ARM不需要的东西,但是如果你生活在应用程序空间中,你可能不需要它们,也不需要ARM。如果没有其他东西的话,手臂对于教育目的是有益的。理解为什么您可能不想分割或使用未对齐的访问。

    ARM世界有点混乱

    对于C程序员来说,事情很简单:所有ARM体系结构都提供了一个常规的32位平面寻址编程模型。只要您继续使用C源代码,您可能会看到的唯一区别就是endianness和性能。大多数ARM处理器(即使是旧型号)都可以是big-endian和little-endian;然后由逻辑板和操作系统进行选择。好的C代码是与endian无关的:无论平台是否为endian,它都能正确编译和工作(endian中立性有利于可靠性和可维护性,但也有利于性能:非中立代码是通过大小不同的指针访问相同数据的代码,这会破坏编译器用于优化代码的严格别名规则)

    如果你考虑<强>二进制