ARM 与 x86 上的 Linux 和 Android 应用程序

Sum*_*man 2 ubuntu arm android x86

有大量基于 ARM 的低成本迷你设备问世(Cotton Candy 等)。其中一些仅适用于 Android,一些仅适用于 Linux,还有一些允许两种操作系统运行。

唯一的问题是:所有这些都是基于 ARM 的设备。虽然 Android 应用程序可以在 x86 和 ARM 上的 Android 上运行,但我很难找到在 ARM 上的 Linux 上运行的有用应用程序 - 事实上,即使是 ARM 上的 Ubuntu 仍然没有得到很好的支持。

我有两个相关的问题:

  1. 制作可以运行 Ubuntu/Linux 和相关 x86 应用程序的低成本 x86 设备难吗?
  2. Android 应用程序如何可以在 x86 和 ARM 上无缝运行,而 Linux 应用程序必须为 ARM 重新编译?

gol*_*cks 6

严格来说,“Linux”是 Android 和类 Unix 操作系统使用的操作系统内核,通俗地称为 linux,有时更正式地称为 GNU/Linux,我们通过 ubuntu 和 debian 等发行版了解它。操作系统内核 Linux 是用 C 编写的,必须编译为本地机器代码。

我认为 jordanm 在回答关于GNU/Linux 和 Android 之间用户空间差异的问题#2 方面做得很好。这是Android堆栈:

Linux (native machine code, instantiated by bootloader)
Dalvik (native machine code, instantiated by linux)
Application (java bytecode instantiated by dalvik)
Run Code Online (Sandbox Code Playgroud)

Dalvik 是一个运行时解释字节码的“虚拟机”,字节码是从 java 预编译的。换句话说,它是一个像服务器一样一直运行的用户空间应用程序,它处理请求以处理字节码。Android 应用程序是用 java 编写的,预编译为字节码,并在 dalvik 虚拟机中运行。

这与运行时解释器(例如 shell、python、perl、ruby 和 javascript)所做的非常相似,因为这意味着如果解释器可以,为这些解释器编写的代码也可以工作。对于代码和执行之间的阶段,它们并不都具有相同的策略,但这是另一个主题。

这些解释器都由操作系统内核运行,该内核也运行计算机。内核和解释器都作为机器码存在于磁盘上;内核被引导加载到内存中,因此通过处理器运行的基本指令流是内核的;内核还可以从它加载到 ram 的其他机器代码工件(例如 dalvik 虚拟机,或 init 守护程序,或 shell,或 X 服务器)中流式传输指令,它是系统的组合逻辑,它将指令交错在处理器流,以便内核保持其角色并且不能被替换。它是所有硬件的看门人,所以很多路都通向它,它控制着时钟。

android/dalvik 简化了用户端应用程序的可移植性,就像 perl 或 python 简化一样。它是作为一种优化形式从代码中编译出来的,而不是为了满足任何特定架构的需要。解释器与内核一样,必须以特定于体系结构的方式进行配置和编译。

现在这里是 GNU/Linux 堆栈:

Linux (native machine code, instantiated by bootloader) 
Application (native machine code, instantiated by linux)
Run Code Online (Sandbox Code Playgroud)

此处的应用程序包括 shell 和 init 守护程序。从这个意义上说,shell 脚本不是应用程序,因为它们由 shell 解释,java、python、perl 等程序也不是,但是从 shell 或 init 守护程序启动的应用程序如果它们作为本地机器代码存在于磁盘上,因为 init 和 shell 实际上要求内核为它们做这件事——它们不能自己做。

所有这些应用程序——shell、init 守护进程、X 服务器、你的 web 浏览器,大部分是用 C 或 C++ 编写的——必须单独编译成特定于体系结构的形式。

希望能有所启发。关于 ARM 上的 linux,有两个主要流,一个用于Raspberry Pi上使用的 armv6 指令集——它们是专门的——另一个用于 armv7 的更通用的流,我相信它包括大多数移动设备。Fedora、debian、ubuntu 等。ARM 发行版是后者,而pidora、raspbian 等是前者。