Почему так много разных ядер Android (технический ответ, пожалуйста)

17

Разве Android не является распространенным ядром, которое используется на всех устройствах? Например, CentOS будет установлен на Dell, HP и другие устройства. Конечно, есть разные модули, но тем не менее это CentOS.

По какой причине CyanogenMod всегда "сломан"? Я всегда слышу на форумах, что они работают над портированием этого драйвера или этого драйвера. Если бы они использовали одно и то же ядро, разве драйверы не работали бы с ним? Я также вижу миллион различных типов ядер для разных устройств.

user974896
источник

Ответы:

24

Ядра варьируются от производителя к производителю. Многие из этих ядер взяты из чистой исходной линейки исходных кодов, найденных на CAF. Эти производители делают так, что берут эти исходные источники, модифицируют их в соответствии с используемой платой / чипсетом, а также реализуют свои собственные драйверы.

Внимательно осмотрите себя, есть вариации сенсорных экранов, вариации чипсетов Wi-Fi, не говоря уже о акселерометре, датчиках, батареях, компасе, звуке, графике.

Взяв один источник ядра, например, HTC не будет работать на Samsung, и наоборот.

Производители могут выбирать различные биты, встроенные в печатную плату. Здесь нет жестких или быстрых правил. Отсюда множество взломов / модификаций, чтобы ядро ​​работало правильно.

Вы никогда не должны сравнивать это с настольными дистрибутивными ядрами Linux, в которых есть PCI, PCI-Express, SATA, VGA, SVGA, USB, Ethernet, поскольку они представляют собой совершенно иную игру для игры в мяч. Основное отличие от CentOS и Android Linux Kernel заключается в следующем: ВСЕ драйверы компилируются либо как модули, либо как встроенные, поэтому любой дистрибутив Linux будет просто «работать из коробки». Опять же , с настольными распределениями Linux - у вас есть одна архитектура - x86 , следовательно , один Linux ядро от сказать Dell PC, может работать из коробки на Lenovo при условии , что болотно стандартные драйверы собраны.

Не забывайте, что в мире Android есть вариации ядра, построенные для определенных наборов микросхем ARM, таких как ARMv6, ARMv7, есть TEGRA, есть EXYNOS, и они двоично несовместимы друг с другом. Следовательно, если ядро ​​скомпилировано для TEGRA, забудьте об этом, оно не будет работать на ARMv7!

Причина, по которой некоторые ядра на Android выглядят «сломанными», зависит от производителя. Некоторые (Zte - один очень хороший пример) выпускают забитый источник, который может компилироваться из источника, но не загружается из-за отсутствия драйвера, который не покрывается лицензией GPLv2 или GPLv3. Вот в чем проблема, поэтому некоторым хакерам приходится рыскать по github в поисках подсказок; некоторые производители, если не все, выполняют. Текущее воплощение источника Zte якобы должно быть 2.6.35.7, но на самом деле его исходная база 2.6.32.9 с большим количеством модификаций, таким образом, не представляет истинный источник ядра для 2.6.35.7!

Именно здесь производители должны выпустить свои соответствующие источники, не только из-за несовместимости с GPLv2 или новее, но и для того, чтобы сообщество могло модифицировать его, например, добавив функции разгона.

Следовательно, за кулисами происходит хакерство и много возни с драйверами, пытающимися заставить его работать, и его отладка тоже непроста. Некоторые драйверы могут иметь перекрестную лицензию, НО не может распространяться в зависимости от условий и условий, так как переговоры.

К счастью, теперь все изменилось с исходниками ядра 3.xx, так как драйверы Android теперь интегрированы в основные источники. Но есть гоча!

Попробуйте перенести ядро ​​3.xx на существующую трубку, которой около 12-18 месяцев; Ни шанса снежного кома в аду это не сработало бы, потому что из-за различных факторов источники 3.xx сильно отличаются от источника 2.6.x и потребовалось бы много взлома, чтобы заставить его работать - я должен знать, пытался портирование источника 2.6.38.6 для Zte Blade и не удалось.

Аналогичным образом, последняя версия ядра 3.0.1 - при работе над проектом ics4blade на Modaco предпринимала многочисленные попытки его портировать, но это сводится к тому простому факту, что Zte сделал очень плохой беспорядок в источнике, что делало перенос почти невозможным ,

t0mm13b
источник
Проголосует всем вокруг !!! Спасибо за подробный ответ.
user974896
Всегда пожалуйста! Все, что вам нужно знать! : D
t0mm13b
Из того, что вы говорите, драйверы не все скомпилированы как модули, но интегрированы в само ядро, поэтому даже если CM получает рабочее ядро ​​на устройстве, он не может просто «переместить модули XXX» в новую сборку и заставить его работать, потому что не может быть XXX модулей. Драйверы должны быть выслежены, взломаны (возможно) и перекомпилированы.
user974896
2
Правильно, а также драйверы разные, поэтому один драйвер для сенсорного экрана на одной трубке не будет работать на другой трубке, которая использует другой сенсорный экран. Кроме того, следует отметить еще один ключевой момент - некоторые драйверы зависят от версии ядра - Zte выпустил версию драйвера Atheros Wifi для Blade, и этот драйвер не будет работать, если ядро ​​не версии 2.6.35.7, любой другой версии, Перерывы Wi-Fi - это демонстрация зависимости в довольно хакерской и сломанной манере делать подобные вещи.
t0mm13b
12

Архитектура ПК построена вокруг обычных компонентов, поскольку изначально она представляла собой клоны определенного продукта, IBM PC, которые были специально разработаны для обеспечения совместимости с ним и, следовательно, друг с другом. Вообще говоря, вы можете взять программу или периферийное устройство с одного ПК-совместимого и поместить его в другой, и ожидать, что он будет работать. Эта способность достаточно полезна, чтобы люди продолжали требовать ее, даже когда технология развивалась. Вы можете вставить карту PCI Express в любой современный ПК, точно так же, как вы могли вставить карту ISA в любой клон компьютера.

У смартфонов такой истории нет. Они спроектированы как монолитные продукты, целостная система, состоящая из аппаратного и программного обеспечения, которое «просто работает» как есть. Нет никаких ожиданий, что люди возьмут детали из одного телефона и поместят их в другой, поэтому инженерам не нужно принимать во внимание совместимость при разработке своих продуктов.

Даже в дереве исходных текстов ядра Linux в драйверах для платформ ARM много фрагментации . Поскольку телефоны обычно разрабатываются за закрытыми дверями, инженерные группы в разных компаниях часто заканчивают выполнение дублирующей работы, разрабатывая в основном то же оборудование, что и их конкуренты, а затем пишут свои собственные драйверы для собственного дизайна. Как только они готовы и продукт выпущен, они сразу приступают к работе над следующим; не стоит тратить время на то, чтобы вернуться и реорганизовать драйверы для прошлых продуктов или объединить их с драйверами конкурентов. Результатом является множество одноразовых драйверов для устройств, которые похожи, но не совсем одинаковы.

Кроме того, смартфоны обычно основаны на SOC, которые имеют специализированное аппаратное обеспечение, интегрированное вместе с процессором. Для некоторых из них это может быть больше, чем вопрос, загружать или не загружать определенный драйвер; ядро в целом, возможно, потребуется собрать со специальными опциями конфигурации для работы на одном SOC, которые несовместимы со специальными опциями, необходимыми для работы на другом SOC.

Wyzard - Стоп Harming Моника--
источник
5

Причина в том, что ядро ​​Linux Android обычно не компилируется на самом Android, вместо этого его приходилось кросс-компилировать с другого компьютера. Это вызывает различные проблемы, потому что конфигурация устройства недоступна во время компиляции, и невозможно скомпилировать универсальное ядро ​​со всеми драйверами из-за ограниченного пространства (тогда как большинство настольных дистрибутивов просто скомпилировали все драйверы в модули, загруженные из initramfs) , Поэтому разработчики должны были выяснить, какие драйверы нужно упаковать для каждого конкретного устройства. Мало того, что у каждого драйвера обычно есть десяток или около того опций времени компиляции, чтобы переключать различные функции драйвера, и производители обычно не выпускают свою официальную конфигурацию (худшие нарушители даже не открывают свои драйверы с открытым исходным кодом, или не поддерживают апстрим копии драйверов в актуальном состоянии).

Программирование драйвера намного сложнее, чем программирование приложений, поскольку нет ядра, которое защищало бы вас от непостоянного оборудования, которое имеет определенные требования к синхронизации в реальном времени и тому подобное, и это означает, что даже наличие другой характеристики производительности может привести к пропуску драйвера некоторые жесткие события в реальном времени от оборудования; эти ошибки могут возникать как ошибки или проблемы с производительностью.

Другая проблема - двоичная несовместимость. Есть две причины двоичной несовместимости, во-первых, это тип процессора, который хорошо охвачен t0mm13b, но другая проблема, которая более актуальна для портирования, это несовместимость ABI (двоичный интерфейс приложения). Если производители не открывают свои драйверы с открытым исходным кодом, разработчики должны были использовать скомпилированный модуль из стандартного ПЗУ. Это поднимает различные проблемы несовместимости ABI, поскольку у самих модулей драйвера есть определенные ожидания, например, относительно структуры структуры и параметров вызова функций, и когда ядро ​​компилируется, у него нет файла заголовка для описания ABI во время драйвера компилируется, поэтому разработчикам пришлось перепроектировать драйвер, чтобы создать файл заголовка, или файлы заголовков в дереве исходного кода могли быть сильно изменены, поскольку драйвер компилировался, и разработчикам пришлось отменить эти изменения, чтобы сделать ядро ​​снова совместимым с ABI драйвера. В отличие от компиляции из исходного кода, компиляция для бинарного драйвера не вызовет ошибку компиляции из-за несоответствия параметров функции или несовместимости структур, она просто вызовет сбой вашего устройства во время его работы, и отладка этих проблем очень трудна. В мире ПК мы знакомы с тем беспорядком, который оставили нам nVidia и ATi, из-за их настойчивого желания выпустить драйверы только для двоичного кода, представьте, что этот беспорядок существует для всех драйверов, представьте себе «забаву», которую это создает.

Аппаратное обеспечение ПК, как правило, лучше стандартизировано, чем мобильное оборудование, большинству ПК не требуются драйверы для вибраторов, акселерометра, гироскопа, 3G-радио, датчика приближения, NFC и т. Д. Даже на устройствах с поддержкой 3G оно обычно подключается к оборудованию с использованием стандартизированного оборудования. соединения, такие как PCMCIA или PCI-E.

Ли Райан
источник
4

Ну .... драйверы и ядро ​​не совсем совпадают.

Драйверы - это то, что контролирует сотовую антенну, Wi-Fi, Bluetooth и т. Д. Это проприетарные драйверы, потому что производитель должен создать способ (драйверы) общаться со своим оборудованием.

Ядро является промежуточным уровнем между ОС / приложением и фактическими драйверами (или процессором, или памятью, или любым другим оборудованием). Это то, что позволяет вашей ОС / приложениям взаимодействовать с этими аппаратными компонентами.

Все миллионы ядер, которые вы видите, на самом деле мало чем отличаются друг от друга. Обычно программист / моддер берет существующее ядро ​​и «подправляет» его, чтобы попытаться получить из него разницу в производительности. По сути, вы можете сказать, что они только настраивают (по большей части) «конфигурацию» ядра. В мире Android эти моддеры в первую очередь смотрят: разгон или разгон тактовых частот процессора (это важно либо для экономии заряда батареи, либо для попытки запуска большинства ресурсоемких приложений, таких как эмуляторы видеоигр или воспроизведения видео), либо они обращают внимание на недостаточную производительность вольт (чтобы продлить срок службы батареи, запустив ваш процессор за пределами его первоначальных установленных параметров ... который по разному влияет на человека, потому что нет двух одинаковых процессоров на 100% одинаковых).

Брайан Денни
источник
Я имею в виду, например, что с CyanogenMod всегда есть жалобы на мой Wi-Fi, Bluetooth и т. Д. Не работает. Почему эти драйверы должны быть "портированы" на CyanogenMod. Почему они не могут просто взять стоковые драйверы, скопировать их на устройство и запустить их с CyanogenMod
user974896
не существует такого понятия, как «стандартный» драйвер для устройств. Каждое устройство имеет разные драйверы для аппаратного обеспечения, такие как камера, чип Wi-Fi и т. Д. И они обычно имеют закрытый источник, поэтому им приходится «взламывать» свой путь, заставляя работать драйверы.
Райан Конрад
1
Да но зачем взламывать. Если они работают с ядром OEM, почему вы не можете просто переместить файлы драйверов и связанные библиотеки в установку мода Cyanogen, поскольку ядро ​​в основном то же самое.
user974896
1

Телефоны и другие встроенные устройства не имеют BIOS для обеспечения абстракции между оборудованием и ОС, в результате чего ОС компилируется для оборудования, на котором она развернута. Даже устройства, использующие один и тот же набор микросхем, могут быть настроены по-разному (с использованием альтернативных шин связи и т. Д.), В результате чего ядро ​​должно быть скомпилировано соответствующим образом. Поскольку не ожидается никаких изменений в оборудовании, аппаратное обнаружение не выполняется. Ядро загружается быстрее и в результате становится меньше - это стандартный принцип встроенной ОС

РЦЭ Мортимер
источник
0

CentOS устанавливается на другом оборудовании, но,

  1. Это все ПК, которые отличаются меньше, чем телефоны,
  2. Ядро Ubuntu, ядро ​​Debian и элементарное ядро ​​- это разные источники ядра.

Что касается вашего второго пункта, см. Ответ (ы), опубликованные ранее.

Эван Ланглуа
источник