Есть ли причина, по которой на устройствах Android нет уровня аппаратной абстракции в обычном смысле?
Экономические причины:
Устройства Android, как правило, представляют собой одноплатные устройства на базе ARM со всем встроенным оборудованием, и это оборудование не изменится в течение срока службы устройства. Пользователь обычно просто покупает новое устройство.
Android - это встроенный тип операционной системы. Оборудование, на котором работает Android, как правило, не поддерживает и не запускает какую-либо другую операционную систему.
ACPI - сложный стандарт, который сложно реализовать.
Для таких вещей, как телефоны, время выхода на рынок стоит для компаний больше, чем разработка стандартов, которые используют другие компании. Windows, желая продавать операционные системы, которые работают на разных производителях оборудования на базе Intel, явно предпочитала иметь этот стандарт (и Intel, и Microsoft приложили руку к разработке ACPI).
Технические причины:
Windows во многом зависит от прошивки (BIOS или UEFI) во время запуска и во время работы. Linux может быть настроен так, чтобы вообще не полагаться на прошивку после загрузки, и для платформ ARM это, вероятно, типично.
- Столь более простые (и менее дружественные) схемы можно использовать с Linux, например, с деревьями устройств или просто с встроенными в ядро драйверами, которые знают, где находится их оборудование на платформе, без необходимости какого-либо обнаружения.
но когда кто-то пытается прошить ROM на другом устройстве Android, он не работает
Загрузчик в устройствах Android часто настраивается на загрузку только подписанного образа - если образ, содержащий ОС, не подписан, он не будет работать.
Сам загрузчик часто зависит от аппаратного обеспечения и предназначен для конкретной платы. (Вы не можете взять BIOS для одной модели ноутбука и ожидать, что он будет работать на другой модели ноутбука - вам, как OEM, придется создавать новый BIOS для новой платформы). Если образ ROM содержит загрузчик и вы пытаетесь запустить его на неправильной платформе, он, вероятно, не будет работать.
Драйверы Linux для аппаратных устройств во многих устройствах Android не с открытым исходным кодом. Включает в себя такие вещи, как дисплей, Wi-Fi, сотовая связь. Так что они не будут работать с более поздними версиями ядра. Вероятно, это основная причина, по которой разные ПЗУ не будут работать, потому что версия ядра - более поздняя, более качественная, но более новый драйвер недоступен (и его нельзя создать без исходного кода).
Параметры командной строки, передаваемые загрузочному ядру, могут иметь решающее значение - например, эти параметры могут указывать ядру избегать определенных диапазонов памяти, которые приводят к блокировке системы при обращении к ней.