ARM 및 x86의 Linux 및 Android 앱

ARM 및 x86의 Linux 및 Android 앱

저가의 ARM 기반 미니 디바이스(솜사탕 등)가 많이 나오고 있습니다. 그 중 일부는 Android 전용이고 일부는 Linux 전용이며 일부는 두 운영 체제를 모두 실행할 수 있습니다.

유일한 문제는 이들 모두가 ARM 기반 장치라는 것입니다. Android 앱은 x86과 Android on ARM에서 모두 실행될 수 있지만 ARM 기반 Linux에서 실행되는 유용한 앱을 찾는 데 어려움을 겪었습니다. 실제로 Ubuntu on ARM도 아직 제대로 지원되지 않습니다.

두 가지 관련 질문이 있습니다.

  1. Ubuntu/Linux 및 관련 x86 애플리케이션을 실행할 수 있는 저렴한 x86 장치를 만드는 것이 어렵습니까?
  2. Android 앱은 x86 및 ARM에서 원활하게 실행되는 반면 Linux 앱은 ARM용으로 다시 컴파일해야 하는 이유는 무엇입니까?

답변1

엄밀히 말하면 "Linux"는 Android와 Unix 계열 운영 체제 모두에서 사용되는 운영 체제 커널입니다.평신도의 관점에서Linux로 알려져 있으며 때로는 더 공식적으로 GNU/Linux로 알려져 있으며 우분투 및 데비안과 같은 배포판을 통해 알려져 있습니다. Linux 운영 체제 커널은 C로 작성되었으며 기본 기계어 코드로 컴파일되어야 합니다.

조던이 2번 질문에 아주 잘 대답한 것 같아요사용자 공간GNU/Linux와 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 가상 머신 내에서 실행됩니다.

이는 쉘, 파이썬, 펄, 루비, 자바스크립트 등의 런타임 인터프리터가 수행하는 작업과 매우 유사합니다. 즉, 이러한 인터프리터용으로 작성된 코드가 작동함을 의미합니다.통역사가 그렇게 한다면. 코드와 실행 사이의 단계에 대해 모두 동일한 전략을 갖고 있지는 않지만 이는 또 다른 주제입니다.

이러한 인터프리터는 모두 컴퓨터를 실행하는 운영 체제 커널에 의해 실행됩니다. 커널과 인터프리터는 모두 디스크에 기계어 코드로 존재합니다. 커널은 메모리에 부팅됩니다.프로세서를 통해 실행되는 명령어의 기본 흐름은 커널의;커널은 또한 RAM에 로드된 다른 기계 코드 아티팩트(예: dalvik 가상 머신, init 데몬, 셸 또는 X 서버)의 명령을 스트리밍할 수 있으며 시스템의 조합 논리는 프로세서 스트림의 명령을 인터리브하여 코어가 그 역할은 대체될 ​​수 없습니다. 모든 하드웨어의 문지기이기 때문에 많은 길이 이곳으로 연결되며 시계를 제어합니다.

android/dalvik은 Perl이나 Python이 단순화하는 것처럼 사용자 애플리케이션 이식성을 단순화합니다. 최적화의 형태로 코드에서 컴파일됩니다.특정 아키텍처의 요구 사항을 충족하기 위한 것이 아닙니다.. 커널과 마찬가지로 인터프리터도 아키텍처별 방식으로 구성하고 컴파일해야 합니다.

이제 이것은 GNU/Linux 스택입니다:

Linux (native machine code, instantiated by bootloader) 
Application (native machine code, instantiated by linux)

여기에 있는 응용 프로그램에는 Shell 및 init 데몬이 포함됩니다. 이러한 의미에서 쉘 스크립트는 쉘에 의해 해석되므로 애플리케이션이 아니며 Java, Python, Perl 등과 같은 프로그램도 아니지만 디스크에 기본 기계 코드로 존재하는 경우 쉘 또는 init 데몬에서 실행되는 애플리케이션입니다. 응용 프로그램입니다. , init와 shell은 실제로 커널에게 이를 수행하도록 요청하기 때문에 스스로 수행할 수는 없습니다.

셸, init 데몬, X 서버, 웹 브라우저(주로 C 또는 C++로 작성됨) 등 이러한 모든 애플리케이션은 아키텍처별 형식으로 개별적으로 컴파일되어야 합니다.

이것이 영감을 주기를 바랍니다. ARM 기반 Linux에는 두 가지 주류가 있습니다. 하나는 ARM에서 사용되는 armv6 명령어 세트입니다.라즈베리 파이- 이것들은 전문화되어 있습니다. 또한 대부분의 모바일 장치를 포함한다고 생각되는 armv7에 대한 일반 스트림도 있습니다. Fedora, debian, ubuntu 등의 ARM 배포판은 후자에 속하고, pidora, raspbian 등은 전자에 속합니다.

답변2

두 번째 질문은 이 사이트의 주제와 더 관련이 있으므로 답변하겠습니다. Android 애플리케이션은 가상 머신이라는 프로세스를 실행합니다 Dalvik. 이는 Java의 JVM과 매우 유사합니다. 이것의 기본 아이디어는 "한 번 작성하면 어디에서나 실행 가능"입니다. Java 코드는 기본 기계어 코드로 컴파일되지 않고 VM에서 실행할 수 있는 바이트코드로 컴파일됩니다. C와 같은 언어의 경우 코드는 아키텍처에 따라 달라지는 기계어 코드로 컴파일됩니다.

관련 정보