Linux e aplicativos Android no ARM vs x86

2

Existe uma infinidade de mini-dispositivos baseados em ARM de baixo custo (Algodão Doce, etc). Alguns deles são apenas para Android, alguns apenas para Linux, e alguns permitem que ambos os sistemas operacionais sejam executados.

O único problema é: todos esses são dispositivos baseados em ARM. Embora os aplicativos para Android possam ser executados no Android em x86 e ARM, estou tendo dificuldade em encontrar aplicativos úteis que sejam executados no Linux em ARM - na verdade, até mesmo o Ubuntu em ARM ainda não é bem suportado.

Eu tenho duas perguntas relacionadas:

  1. É difícil criar dispositivos x86 de baixo custo que possam executar o Ubuntu / Linux e aplicativos x86 relevantes?
  2. Como é possível que os aplicativos para Android possam ser executados perfeitamente no x86 e no ARM, enquanto os aplicativos do Linux precisam ser recompilados para o ARM?
por Suman 16.01.2013 / 22:47

2 respostas

5

"Linux", estritamente falando, é um kernel de sistema operacional usado tanto pelo Android quanto pelo sistema operacional similar ao unix, chamado colloquially como linux, e algumas vezes mais formalmente como GNU / Linux que conhecemos via distribuições como o Ubuntu e o Debian. Linux, o kernel do sistema operacional, é escrito em C e deve ser compilado no código da máquina nativa.

Acho que o jordanm fez um bom trabalho ao responder à questão # 2 em relação às diferenças entre espaço do usuário entre o GNU / Linux e o Android . Aqui está a pilha do Android:

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

O Dalvik é uma "máquina virtual", cujo tempo de execução interpreta o bytecode, e o bytecode é pré-compilado a partir do java. Em outras palavras, é um aplicativo de espaço do usuário que está sendo executado o tempo todo como um servidor e lida com solicitações para processar bytecode . Aplicativos Android são escritos em java, pré-compilados para bytecode e executados dentro da máquina virtual dalvik.

Isso é muito semelhante ao que os interpretadores de tempo de execução, como shell, python, perl, ruby e javascript, fazem no sentido de que o código escrito para esses intérpretes funcionará se o interpretador . Eles nem todos têm a mesma estratégia em relação aos estágios entre o código e a execução, mas esse é outro tópico.

Esses interpretadores são todos executados por um kernel do sistema operacional, que também executa o computador. O kernel e o interpretador existem no disco como código de máquina; o kernel é carregado na memória RAM e, doravante, o fluxo de instrução fundamental que passa pelo processador é do kernel ; o kernel também pode transmitir instruções de outros artefatos de código de máquina que ele carrega no RAM (como a máquina virtual dalvik, ou o daemon de inicialização, ou o shell ou o servidor X) e é a lógica combinada do sistema que intercala instruções em o fluxo do processador de forma que o kernel mantenha sua função e não possa ser deslocado. É o porteiro de todo o hardware, então muitas estradas levam de volta a ele e controla o relógio.

A portabilidade para aplicações terrestres de usuários é simplificada para android / dalvik, assim como é simplificada para perl ou python. É compilado a partir do código como uma forma de otimização, não para atender às necessidades de qualquer arquitetura específica . O interpretador é o que, como o kernel, deve ser configurado e compilado de uma maneira específica da arquitetura.

Agora aqui está a pilha GNU / Linux:

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

As aplicações aqui incluem o shell e o daemon de inicialização. Scripts Shell não são aplicativos nesse sentido, pois são interpretados pelo shell, e nem são programas java, python, perl, etc., mas aplicativos iniciados a partir do shell ou pelo daemon init são se existirem no disco como código de máquina nativo , porque o init e o shell realmente pedem ao kernel para fazer isso por eles - eles não podem fazer isso sozinhos.

Todos esses aplicativos - o shell, o daemon de inicialização, o servidor X, o navegador da Web, principalmente escritos em C ou C ++ - devem ser compilados individualmente em um formulário específico da arquitetura.

Espero que lance alguma luz. No que diz respeito ao Linux em ARM, existem dois fluxos primários, um para o conjunto de instruções armv6 usado no Raspberry Pi - estes são especializados - e mais um vapor geral para armv7, que acredito incluir a maioria dos dispositivos móveis. As distribuições fedora, debian, ubuntu, etc. ARM são as últimas, onde pidora, raspbian, etc. são as primeiras.

    
por 17.01.2013 / 01:32
3

Vou abordar a segunda questão, pois é mais sobre o assunto no site. Aplicativos Android executam uma máquina virtual de processo conhecida como Dalvik . Isso é muito parecido com a JVM do java. A ideia por trás disso é "escreva uma vez, corra em qualquer lugar". O código Java não é compilado para código de máquina nativo, é compilado para bytecode que pode ser executado pela VM. Com uma linguagem como C, o código é compilado em código de máquina, que varia dependendo da arquitetura.

    
por 16.01.2013 / 23:26