"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.