ARM 與 x86 上的 Linux 和 Android 應用程序
有大量基於 ARM 的低成本迷你設備問世(Cotton Candy 等)。其中一些僅適用於 Android,有些僅適用於 Linux,有些則允許兩種作業系統都執行。
唯一的問題是:所有這些都是基於 ARM 的設備。雖然 Android 應用程序可以在 x86 和 ARM 上的 Android 上執行,但我很難找到在 ARM 上的 Linux 上執行的有用應用程序 - 事實上,即使 ARM 上的 Ubuntu 仍然沒有得到很好的支持。
我有兩個相關的問題:
- 製造能夠執行 Ubuntu/Linux 和相關 x86 應用程序的低成本 x86 設備很難嗎?
- Android 應用程序如何在 x86 和 ARM 上無縫執行,而 Linux 應用程序必須為 ARM 重新編譯?
嚴格來說,“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)
Dalvik 是一個執行時解釋字節碼的“虛擬機”,字節碼是從 java 預編譯的。換句話說,它是一個像伺服器一樣一直執行的使用者空間應用程序,它處理處理字節碼的請求。Android 應用程序是用 java 編寫的,預編譯為字節碼,並在 dalvik 虛擬機中執行。
這與執行時解釋器(如 shell、python、perl、ruby 和 javascript)所做的非常相似,因為這意味著為這些解釋器編寫的程式碼將在解釋器執行的情況下工作。對於程式碼和執行之間的階段,它們並不都有相同的策略,但這是另一個話題。
這些解釋器都由作業系統核心執行,該核心也執行電腦。核心和解釋器都作為機器程式碼存在於磁碟上;核心被引導載入到 ram 中,此後通過處理器執行的基本指令流是核心的;核心還可以將來自它載入到 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,有兩個主要流,一個用於Raspberry Pi上使用的 armv6 指令集——這些是專門的——另一個用於 armv7 的更通用的流,我相信它包括大多數移動設備。fedora、debian、ubuntu 等。ARM 發行版屬於後者,而 pidora、raspbian 等屬於前者。