Los granos varían de un fabricante a otro. Muchos de esos núcleos provienen de la línea de fuentes de kernel puro que se encuentra en CAF, lo que estos fabricantes hacen es tomar esas fuentes de stock, modificarlas para adaptarlas según la placa / chipset utilizado, también, implementar sus propios controladores.
Mire a su alrededor, hay variaciones de pantallas táctiles, variaciones de chipsets wifi, sin mencionar, acelerómetro, sensores, baterías, brújula, sonido, gráficos.
Tomar una fuente de kernel de, por ejemplo, HTC no funcionará en un Samsung, y viceversa.
Los fabricantes son libres de seleccionar o externalizar varios bits que se incorporan a la placa de circuito. No hay reglas duras o rápidas involucradas. De ahí la gran cantidad de piratería / modificaciones para que el kernel funcione correctamente.
Nunca debe compararse con los núcleos de distribución Linux de escritorio en los que tiene PCI, PCI-Express, SATA, VGA, SVGA, USB, Ethernet, ya que son un juego de pelota totalmente diferente. Las principales diferencias con CentOS y con el kernel de Linux de Android son las siguientes: TODOS los controladores se compilan como módulos o integrados, por lo tanto, cualquier distribución de Linux simplemente "funcionará de inmediato". Una vez más, con las distribuciones de Linux de escritorio, tiene una arquitectura, x86, por lo tanto, un kernel de Linux, por ejemplo, una PC Dell, puede funcionar de inmediato en un Lenovo siempre que se compilen los controladores estándar.
No olvide que, en el mundo de Android, hay variaciones del kernel creado para conjuntos de chips ARM específicos, como ARMv6, ARMv7, hay TEGRA, EXYNOS y son binarios incompatibles entre sí. Por lo tanto, si se compila un núcleo para TEGRA, ¡olvídalo, no funcionará en ARMv7!
La razón por la que algunos núcleos en Android parecen estar "rotos" depende del fabricante. Algunos (Zte es un muy buen ejemplo) lanzan una fuente descifrada que puede compilarse desde la fuente pero no se inicia debido a la falta de un controlador que no está cubierto por la licencia GPLv2 o GPLv3. Ese es el problema, por lo tanto, algunos hackers tienen que buscar en Github buscando algunas pistas; algunos fabricantes, si no todos, cumplen. ¡La encarnación actual de la fuente de Zte supuestamente es 2.6.35.7, pero en realidad su base de fuente 2.6.32.9 con muchas modificaciones, por lo tanto, no representa la verdadera fuente del núcleo para 2.6.35.7!
Aquí es donde los fabricantes tienen que lanzar sus respectivas fuentes, no solo por no cumplir con GPLv2 o posterior, sino para que la comunidad pueda modificarlo, como agregar capacidades de overclocking.
Por lo tanto, hay piratería involucrada detrás de escena y muchos problemas con los controladores que intentan que funcione, y tampoco es fácil de depurar. Algunos controladores pueden tener una licencia cruzada, PERO no se pueden distribuir dependiendo de la cláusula y las condiciones como negociado
Afortunadamente, todo eso ha cambiado ahora con la línea de fuentes del kernel 3.xx, ya que los controladores de Android ahora están integrados en las fuentes principales. ¡Pero hay una trampa!
Intente portar un núcleo 3.xx a un teléfono existente que tenga entre 12 y 18 meses; No funcionaría una bola de nieve en el infierno, eso se debe a que, debido a los diferentes factores, las fuentes 3.xx son muy diferentes a la fuente 2.6.x y requerirían mucho pirateo para que funcione. Debería haberlo intentado. puerto 2.6.38.6 fuente para Zte Blade y falló.
Del mismo modo, la última versión del kernel 3.0.1: al trabajar en el proyecto ics4blade en Modaco, ha hecho numerosos intentos de portarlo, pero eso se debe al simple hecho de que Zte hizo un desastre muy malo de la fuente que hizo que la portación fuera casi imposible. .
La arquitectura de la PC está construida alrededor de piezas básicas porque comenzó como clones de un producto específico, la PC de IBM, que fueron diseñados específicamente para ser compatibles con ella y, por lo tanto, entre sí. En términos generales, puede tomar un programa o dispositivo periférico de una PC compatible y ponerlo en otro, y esperar que funcione. Esa capacidad es lo suficientemente útil como para que las personas continúen exigiéndola incluso a medida que la tecnología evolucionó. Puede colocar una tarjeta PCI Express en cualquier PC moderna al igual que podría poner una tarjeta ISA en cualquier clon de PC en ese momento.
Los teléfonos inteligentes no tienen esa historia. Están diseñados como productos monolíticos, un sistema completo que consta de hardware y software que "simplemente funciona" tal cual. No se espera que las personas saquen partes de un teléfono y las coloquen en otro, por lo que los ingenieros no tienen que tener en cuenta la interoperabilidad cuando diseñan sus productos.
Incluso dentro del árbol fuente del kernel de Linux, hay mucha fragmentación en los controladores para plataformas ARM . Dado que los teléfonos generalmente están diseñados a puerta cerrada, los equipos de ingeniería en diferentes compañías a menudo terminan haciendo trabajos duplicados, diseñando básicamente el mismo hardware que sus competidores y luego escribiendo sus propios controladores para su propio diseño. Una vez que terminan y se lanza el producto, van directamente a trabajar en el siguiente; No vale la pena volver y refactorizar los controladores de productos anteriores o fusionarlos con los controladores de la competencia. El resultado es una gran cantidad de controladores únicos para dispositivos que son similares pero no iguales.
Además, los teléfonos inteligentes generalmente se basan en SOC que tienen hardware especializado integrado junto con el procesador. Para algo de esto, puede ser más que una cuestión de cargar o no un determinado controlador; Es posible que el núcleo en su conjunto deba construirse con opciones de configuración especiales para ejecutarse en un SOC, que son incompatibles con las opciones especiales necesarias para ejecutarse en otro SOC.
fuente
La razón es que el kernel de Linux de Android generalmente no se compila en el propio Android, sino que debe compilarse de forma cruzada desde otra computadora. Esto causa varios problemas, porque la configuración del dispositivo no está disponible en tiempo de compilación, y no es factible compilar un núcleo genérico con todos los controladores debido a la limitación de espacio (mientras que la mayoría de las distribuciones de escritorio simplemente tenían todos los controladores compilados en módulos cargados desde un initramfs) . Por lo tanto, los desarrolladores tuvieron que averiguar qué controladores empaquetar para cada dispositivo en particular. No solo eso, cada controlador generalmente tiene una docena de opciones de tiempo de compilación para alternar varias características del controlador, y los fabricantes generalmente no lanzan su configuración oficial (los peores delincuentes ni siquiera abren sus controladores, o no mantienen copia de los controladores actualizados).
La programación del controlador es mucho más difícil que la programación de la aplicación, ya que no hay un núcleo que lo proteja del hardware voluble que tiene requisitos de sincronización específicos en tiempo real y demás, y esto significa que incluso tener una característica de rendimiento diferente puede hacer que el controlador pierda algunos eventos difíciles en tiempo real del hardware; Estos errores pueden aparecer como errores o problemas de rendimiento.
Otro problema es la incompatibilidad binaria. Hay dos causas de incompatibilidad binaria, la primera es el tipo de CPU, que ha sido cubierto por t0mm13b bien, pero el otro problema que es más relevante para portar es la incompatibilidad ABI (interfaz binaria de aplicación). Si los fabricantes no abren el código de sus controladores, entonces los desarrolladores tuvieron que usar el módulo compilado desde una ROM estándar. Esto plantea varios problemas de incompatibilidad ABI, ya que los módulos del controlador en sí mismos tienen expectativas específicas sobre, por ejemplo, el diseño de estructura y los parámetros de llamada a funciones, y cuando se compila el núcleo, no tiene el archivo de encabezado para describir el ABI en el momento en que el controlador está compilado por lo que los desarrolladores tuvieron que aplicar ingeniería inversa al controlador para crear un archivo de encabezado o los archivos de encabezado en el árbol de origen podrían haberse modificado mucho ya que el controlador está compilado y los desarrolladores tuvieron que revertir esas modificaciones para que el núcleo sea compatible nuevamente con la ABI del controlador. A diferencia de la compilación desde la fuente, la compilación para el controlador binario no provocará un error de compilación debido a la falta de coincidencia de parámetros de función o incompatibilidad de estructura, simplemente bloqueará su dispositivo mientras se está ejecutando, y la depuración de estos problemas es muy difícil. En el mundo de las PC, estamos familiarizados con el desorden que nos dejaron nVidia y ATi, debido a su insistencia en lanzar controladores solo binarios, imagina tener ese desorden para todos los controladores, imagina la "diversión" que crea.
El hardware de la PC también generalmente está mejor estandarizado que el hardware móvil, la mayoría de las PC no necesitan controladores para vibradores, acelerómetros, giroscopios, radio 3G, sensor de proximidad, NFC, etc. Incluso en dispositivos que tienen 3G, generalmente se conecta al hardware usando estandarizado conexiones como PCMCIA o PCI-E.
fuente
Bueno ... los controladores y el núcleo no son exactamente lo mismo.
Los controladores son los que controlan la antena celular, wifi, bluetooth, etc. Estos son controladores patentados porque el fabricante tiene que crear una forma (los controladores) para comunicarse con su hardware.
El kernel es un nivel intermedio entre el sistema operativo / aplicación y los controladores reales (o CPU o memoria o cualquier otro hardware). Es lo que permite que su sistema operativo / aplicaciones interactúen con estos componentes de hardware.
Todos los millones de núcleos que ves no son realmente muy diferentes entre sí. Por lo general, un programador / modificador tomará el núcleo existente y lo "ajustará" para tratar de obtener un rendimiento diferente. Básicamente se puede decir que solo están ajustando (en su mayor parte) la "configuración" del núcleo. En el mundo de Android, estos modders están mirando principalmente: overclockear el reloj de la CPU (importante para ahorrar batería o tratar de ejecutar la mayoría de las aplicaciones de proceso intensivo, como emuladores de videojuegos o reproducción de video), o están mirando por debajo de volting (para ahorrar vida de la batería ejecutando su CPU fuera de sus parámetros establecidos originales ... que varía en efecto de persona a persona porque no hay dos CPU hechas 100% exactamente iguales).
fuente
Los teléfonos y otros dispositivos integrados no tienen un BIOS para proporcionar abstracción entre el hardware y el sistema operativo como resultado de que el sistema operativo se compila para el hardware en el que se implementa. Incluso los dispositivos que usan el mismo conjunto de chips se pueden configurar de diferentes maneras (usando buses de comunicación alternativos, etc.) \ el resultado es que el núcleo debe compilarse en consecuencia. Como no se esperan cambios en el hardware, no se realiza ninguna detección de hardware. Kernel arranca más rápido y, como resultado, es más pequeño: este es un principio estándar de un sistema operativo incorporado
fuente
CentOS se instala en hardware diferente, pero
En cuanto a su segundo punto, vea las respuestas publicadas anteriormente.
fuente