Por que existem tantos kernels Android diferentes (resposta técnica, por favor)


17

O Android não é um kernel comum usado em todos os dispositivos? Por exemplo, o CentOS será instalado na Dell, HP e em vários outros hardwares. Claro que existem módulos diferentes, mas ainda é o CentOS.

Qual é a razão pela qual o CyanogenMod está sempre "quebrado"? Eu sempre ouço nos fóruns que eles estão trabalhando para portar esse driver ou esse driver. Se eles usassem o mesmo kernel, os drivers não trabalhariam com ele? Também vejo um milhão de tipos diferentes de Kernels para diferentes dispositivos.

Respostas:


24

Os núcleos variam de fabricante para fabricante. Muitos desses kernels vêm da linha de fontes de estoque puro encontrada na CAF, o que esses fabricantes fazem é pegar essas fontes de estoque, modificá-las para se adequarem com base na placa / chipset usado e também implementar seus próprios drivers.

Dê uma boa olhada ao seu redor, há variações de telas sensíveis ao toque, variações de chipsets wifi, sem mencionar acelerômetro, sensores, baterias, bússola, som, gráficos.

Tomar uma fonte de kernel, por exemplo, da HTC não funcionará em uma Samsung e vice-versa.

Os fabricantes são livres para escolher ou terceirizar vários bits que são incorporados à placa de circuito. Não há regras rígidas ou rápidas envolvidas. Daí o monte de hackers / modificações para fazer o kernel funcionar corretamente.

Você nunca deve comparar com os kernels de distribuição Linux de desktop nos quais ele possui PCI, PCI-Express, SATA, VGA, SVGA, USB, Ethernet, pois são um jogo totalmente diferente. As principais diferenças com o CentOS e com o Linux Kernel do Android são as seguintes: TODOS os drivers são compilados como módulos ou integrados, portanto, qualquer distribuição Linux simplesmente "funciona imediatamente". Novamente, com as distribuições Linux para desktop - você tem uma arquitetura - x86, portanto, um kernel Linux, digamos, um PC Dell, pode funcionar imediatamente em uma Lenovo, desde que os drivers padrão sejam compilados.

Não se esqueça, no mundo Android, há variações do kernel criadas para chipsets ARM específicos, como ARMv6, ARMv7, TEGRA, EXYNOS e binários incompatíveis entre si. Portanto, se um kernel for compilado para o TEGRA, esqueça, ele não funcionará no ARMv7!

A razão pela qual alguns kernels no Android parecem "quebrados" é do fabricante. Alguns (Zte é um exemplo muito bom) lançam uma fonte massacrada que pode ser compilada a partir da fonte, mas falha ao inicializar devido a um driver ausente que não é coberto pela licença GPLv2 ou GPLv3. Esse é o problema, portanto, alguns hackers precisam vasculhar o github procurando algumas pistas; alguns fabricantes, se não todos, cumprem. A encarnação atual da fonte do Zte é supostamente 2.6.35.7, mas, na realidade, sua base da fonte 2.6.32.9 com muitas modificações, portanto, não representa a verdadeira fonte do kernel para a 2.6.35.7!

É aqui que os fabricantes precisam liberar suas respectivas fontes, não apenas por estarem em conformidade com a GPLv2 ou posterior, mas também para que a comunidade possa modificá-la, como adicionar recursos de overclock.

Portanto, há hackers envolvidos nos bastidores e muita confusão com os drivers tentando fazê-lo funcionar, e também não é fácil depurar. Alguns drivers podem ter licença cruzada, mas não podem ser distribuídos dependendo da cláusula e condições, como negociado.

Felizmente, tudo isso mudou agora com a linha de fontes do kernel 3.xx, pois os drivers do Android agora estão integrados às fontes convencionais. Mas tem uma pegadinha!

Tente portar um kernel 3.xx para um telefone existente com cerca de 12 a 18 meses de idade; Não seria a chance de uma bola de neve no inferno funcionar, porque, devido aos fatores diferentes, as fontes 3.xx são muito diferentes da fonte 2.6.x e seriam necessárias muitas invasões para fazê-lo funcionar - eu deveria saber, tentei portando a fonte 2.6.38.6 para o Zte Blade e falhou.

Da mesma forma, a versão mais recente do kernel 3.0.1 - ao trabalhar no projeto ics4blade no Modaco, fez inúmeras tentativas de portá-lo, mas isso se deve ao simples fato de que o Zte fez uma bagunça muito ruim da fonte, o que tornava a transferência quase impossível. .


Upvotes todo !!! Obrigado pela resposta detalhada.
user974896

Você é muito bem-vindo! Algo mais que você precisa saber! : D
t0mm13b

Pelo que você está dizendo, os drivers não são todos compilados como módulos, mas integrados ao próprio Kernel; portanto, mesmo que o CM obtenha um kernel em funcionamento em um dispositivo, ele não pode simplesmente "mover os módulos XXX" para a nova compilação e fazê-lo funcionar porque pode não haver modelos XXX. Os drivers devem ser caçados, hackeados (possivelmente) e recompilados.
user974896

2
Os drivers corretos e também são diferentes; portanto, um driver para a tela sensível ao toque em um aparelho não funcionará em outro aparelho que use uma tela sensível ao toque diferente. Além disso, outro ponto importante a ser observado - alguns drivers dependem da versão do kernel - o Zte lançou uma versão do driver Atheros Wifi para o Blade, e o driver não funcionará a menos que o kernel seja da versão 2.6.35.7, qualquer outra versão, wifi breaks - isto é para demonstrar a dependência de uma maneira bastante hackish e quebrada de fazer coisas assim.
precisa saber é o seguinte

12

A arquitetura do PC é construída em torno de peças comuns, porque começou como clones de um produto específico, o IBM PC, que foram projetados especificamente para serem compatíveis com ele e, portanto, entre si. De um modo geral, você pode pegar um programa ou dispositivo periférico de um PC compatível, colocá-lo em outro e esperar que ele funcione. Essa capacidade é útil o suficiente para que as pessoas continuem a exigi-la, mesmo quando a tecnologia evoluiu. Você pode colocar uma placa PCI Express em qualquer PC moderno, assim como uma placa ISA em qualquer clone de PC da época.

Os smartphones não têm esse histórico. Eles são projetados como produtos monolíticos, um sistema completo que consiste em hardware e software que "simplesmente funciona" como está. Não há expectativa de que as pessoas retirem peças de um telefone e as coloquem em outro, para que os engenheiros não precisem levar em consideração a interoperabilidade ao projetar seus produtos.

Mesmo dentro da árvore de fontes do kernel Linux, há muita fragmentação nos drivers para plataformas ARM . Como os telefones geralmente são projetados a portas fechadas, as equipes de engenharia de diferentes empresas geralmente acabam executando trabalhos duplicados, projetando basicamente o mesmo hardware que seus concorrentes e depois escrevendo seus próprios drivers para seu próprio design. Quando terminam e o produto é lançado, eles passam a trabalhar no próximo; não vale a pena voltar e refatorar os drivers de produtos antigos ou mesclá-los aos drivers dos concorrentes. O resultado é uma infinidade de drivers pontuais para dispositivos semelhantes, mas não exatamente iguais.

Além disso, os smartphones geralmente são baseados em SOCs que possuem hardware especializado integrado ao processador. Por um pouco disso, pode ser mais do que uma questão de carregar ou não um determinado driver; o kernel como um todo pode precisar ser construído com opções de configuração especiais para executar em um SOC, que são incompatíveis com as opções especiais necessárias para executar em outro SOC.


5

O motivo é que o kernel Linux do Android geralmente não é compilado no próprio Android; ele precisa ser compilado em outro computador. Isso causa vários problemas, porque a configuração do dispositivo não está disponível no tempo de compilação e não é possível compilar um kernel genérico com todos os drivers devido à limitação de espaço (enquanto a maioria das distros de área de trabalho simplesmente tinha todos os drivers compilados em módulos carregados a partir de um initramfs) . Portanto, os desenvolvedores tiveram que descobrir quais drivers empacotar para cada dispositivo específico. Além disso, cada driver geralmente possui uma dúzia de opções de tempo de compilação para alternar entre vários recursos do driver, e os fabricantes geralmente não divulgam sua configuração oficial (os piores criminosos nem mesmo abrem seus drivers ou não mantêm o upstream). cópia dos drivers atualizados).

A programação do driver é muito mais difícil do que a programação de aplicativos, pois não existe um kernel que o proteja do hardware inconstante que possui requisitos específicos de tempo em tempo real, e isso significa que mesmo ter uma característica de desempenho diferente pode causar falhas no driver alguns eventos difíceis em tempo real do hardware; essas falhas podem aparecer como bugs ou problemas de desempenho.

Outra questão é a incompatibilidade binária. Há duas causas de incompatibilidade binária, primeiro o tipo de CPU, que foi coberto pelo t0mm13b, mas o outro problema mais relevante para a portabilidade é a incompatibilidade ABI (interface binária do aplicativo). Se os fabricantes não abrem seus drivers de código-fonte, os desenvolvedores precisam usar o módulo compilado em uma ROM de estoque. Isso levanta vários problemas de incompatibilidade da ABI, já que os próprios módulos do driver têm expectativas específicas sobre, por exemplo, o layout da estrutura e os parâmetros de chamada de função, e quando o kernel é compilado, ele não possui o arquivo de cabeçalho para descrever a ABI no momento em que o driver é compilado, portanto, os desenvolvedores tiveram que fazer engenharia reversa do driver para criar um arquivo de cabeçalho ou os arquivos de cabeçalho na árvore de origem podem ter sido modificados bastante desde que o driver foi compilado e os desenvolvedores tiveram que reverter essas modificações para tornar o kernel compatível novamente com a ABI do driver. Ao contrário da compilação a partir da fonte, a compilação para o driver binário não acionará um erro de compilação devido à incompatibilidade de parâmetros de função ou incompatibilidade de estrutura, simplesmente travará o dispositivo enquanto estiver em execução e a depuração desses problemas é muito difícil. No mundo dos PCs, estamos familiarizados com a bagunça que a nVidia e a ATi nos deixaram, devido à insistência em liberar apenas drivers binários, imagine ter essa bagunça para todos os drivers, imagine a "diversão" que ela cria.

O hardware do PC também é geralmente mais padronizado do que o hardware móvel; a maioria dos PCs não precisa de drivers para vibradores, acelerômetros, giroscópio, rádio 3G, sensor de proximidade, NFC, etc. Mesmo em dispositivos que possuem 3G, ele geralmente se conecta ao hardware usando conexões como PCMCIA ou PCI-E.


4

Bem .... drivers e o kernel não são exatamente iguais.

Os drivers são os que controlam a antena da célula, o wifi, o bluetooth, etc. Esses são drivers proprietários, porque o fabricante precisa criar uma maneira (os drivers) de falar com o hardware.

O kernel é um nível intermediário entre o SO / aplicativo e os drivers reais (ou CPU ou memória ou qualquer outro hardware). É o que permite aos seus SO / aplicativos interagir com esses componentes de hardware.

Todos os milhões de kernels que você vê não são realmente muito diferentes um do outro. Normalmente, um programador / modder pega o kernel existente e o "ajusta" para tentar obter uma diferença de desempenho. Você pode dizer, basicamente, que eles estão apenas ajustando (na maior parte) a "configuração" do kernel. No mundo Android, esses modders estão olhando principalmente para: aumentar ou diminuir o clock da CPU (importante para economizar a bateria ou tentar executar a maioria dos aplicativos intensivos em processos, como emuladores de videogame ou reprodução de vídeo), ou estão olhando para volting (para economizar bateria, executando sua CPU fora dos parâmetros originais configurados ... o que varia de pessoa para pessoa porque nenhuma CPU é feita 100% exatamente igual).


O que quero dizer é que, por exemplo, com o CyanogenMod, sempre há reclamações do meu wifi, bluetooth etc. não funcionam. Por que esses drivers precisam ser "portados" para o CyanogenMod. Por que eles não podem simplesmente pegar os drivers de estoque, copiá-los para o dispositivo e executá-los com o CyanogenMod
#

não existe um driver "estoque" para os dispositivos. Cada dispositivo possui drivers diferentes para o hardware, como câmera, chip wifi, etc. E eles geralmente são de código fechado, então eles precisam "abrir caminho" para conseguir que os drivers funcionem.
Ryan Conrad

1
Sim, mas por que a necessidade de hackear. Se eles funcionam com o kernel OEM, por que você não pode simplesmente mover os arquivos de driver e as bibliotecas associadas para a instalação do mod Cyanogen, pois o kernel é basicamente o mesmo.
user974896

1

Os telefones e outros dispositivos incorporados não possuem um BIOS para fornecer abstração entre o hardware e o SO, como resultado, o SO é compilado para o hardware no qual está implantado. Mesmo dispositivos que usam o mesmo conjunto de chips podem ser configurados de maneiras diferentes (usando barramentos de comunicação alternativos etc.) \ o resultado é que o kernel precisa ser compilado de acordo. Como não há expectativa de alterações no hardware, não há detecção de hardware realizada. O kernel inicializa mais rápido e é menor como resultado - este é um princípio padrão de um sistema operacional incorporado


0

O CentOS é instalado em hardware diferente, mas,

  1. São todos os PCs que variam menos que os telefones,
  2. Um kernel do Ubuntu, um kernel do Debian e um kernel elementar são todos diferentes fontes de kernel.

Quanto ao seu segundo ponto, veja as respostas postadas anteriormente.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.