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

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

有大量基于 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 重新编译?

答案1

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

我认为乔丹很好地回答了问题#2用户空间GNU/Linux 和 Android 之间的差异。这是 Android 堆栈:

Linux (native machine code, instantiated by bootloader)
Dalvik (native machine code, instantiated by linux)
Application (java bytecode instantiated by dalvik)

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)

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

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

希望这能带来一些启发。关于ARM上的linux,有两个主流,一个是ARM上使用的armv6指令集树莓派——这些是专门的——还有一个针对armv7的通用流,我相信它包括大多数移动设备。 fedora、debian、ubuntu等ARM发行版属于后者,pidora、raspbian等属于前者。

答案2

我将解决第二个问题,因为它更多地涉及该网站的主题。 Android 应用程序运行一个名为 的进程虚拟机Dalvik。这和java的JVM非常相似。这背后的整个想法是“编写一次,随处运行”。 Java 代码不会编译为本机机器代码,而是编译为可由 VM 执行的字节码。使用 C 等语言,代码被编译成机器代码,机器代码根据体系结构而变化。

相关内容