Android file system boot

Разделы внутренней памяти ROM Android — проясним наболевшее о разметке системной памяти

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

Материал направлен, в первую очередь, на изучение обычными пользователями и представлен в качестве вводного экскурса в мир операционных систем Android. Поэтому здесь будет представлена сжатая и поверхностная информация без технических углублений и нюансов. Данный материал будет полезен всем, кто занимается перепрошивкой и кастомизацией прошивок, разработкой под ОС Android, ремонтом мобильных компьютерных систем и обычному пользователю, для лучшего понимания принципов работы и возможностей своего Android’а.

Разделы внутренней памяти Android

Внутренняя память устройства на андроиде разбита на несколько логических дисков (разделов). Приведем классическую разметку памяти:

Bootloader – здесь находится программа (загрузчик), позволяющая запускать операционную систему Android, Recovery и другие сервисные режимы.

Recovery – как видно из названия, тут установлено инженерное меню восстановления или просто Рекавери.

Boot – сердце Андроид ОС, тут находится ядро, драйвера и настройки управления процессором и памятью.

System – системный раздел, в котором находятся все, необходимые для работы Android ОС, файлы, это как папка Windows на вашем диске С:\ (здесь и далее будev проводить ассоциацию с ОС Windows)

Data – раздел для установки приложений и хранения их данных. (Program files)

User – это всем известная sdcard или, проще говоря, место под пользовательские файлы (Мои документы).Здесь мы вынуждены сделать отступление, т.к. размещение данного раздела имеет несколько вариантов:

  • Раздел отсутствует во внутренней памяти, а вместо него используется внешний накопитель — самый популярный вариант. (рис.1)
  • В устройствах со встроенной памятью большого размера, данный раздел видится как sdcard, а внешняя карта памяти видится как sdcard2 или extsd (могут быть и другие варианты названия). Обычно, встречается на устройствах с Android 3.2. (Рис.2 Вариант 1)
  • Данный вариант пришел на смену предыдущему варианту, вместе с Андроид 4.0. Раздел User заменили папкой media на разделе Data, что позволило использовать всю доступную пользователю память для установки программ и хранения данных, а не то количество, что выделил нам производитель. Иными словами sdcard и data являются одним целым. (Рис.2 Вариант 2)

Bootloader, Recovery, adb и fastboot

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

Начнем с Bootloader. Это загрузчик, который запускает Андроид, рекавери и т.п. Когда мы нажимаем кнопку включения, запускается загрузчик и, если нет дополнительных команд (зажатых клавиш), запускает загрузку boot. Если же была зажата комбинация клавиш (у каждого устройства она своя) то запускает, в зависимости от команды, recovery, fastboot или apx. На рисунке ниже наглядно показано, что запускает Bootloader и как взаимосвязаны разделы.

Как видно из рисунка №3, раздел Recovery не влияет на загрузку Андроид ОС, но зачем же он тогда нужен? Давайте попробуем разобраться.

Recovery (рекавери) по сути является маленькой утилитой на ядре Linux и загружается не зависимо от Андроид. Его штатный функционал не богат: можно сбросить аппарат до заводских настроек или же обновить прошивку(заранее скачанную на sdcard). Но, благодаря народным умельцам, у нас есть модифицированные рекавери, через которые можно устанавливать модифицированные (кастомные) прошивки, настраивать андроид, создавать резервные копии и многое другое. Наличие или отсутствие рекавери, а также его версия не влияют на работоспособность Андроид ОС (очень частый вопрос на форумах).

Особо внимательные читатели могли заметить на Рис.3 некий Fastboot. Это интерфейс для работы напрямую с разделами внутренней памяти, при помощи командной строки. Через него можно прошить рекавери, ядро или новую версию прошивки, или же форматировать (удалить всю информацию) тот или иной раздел.

Раз уж зашла речь об интерфейсах, хочу рассказать о еще одном, довольно известном,- adb (android debugbridge). Это, так называемый, режим отладки и назван он так неспроста – через него можно отслеживать работу, как системы в целом, так и отдельных приложений. Но это еще не все, при помощи adb можно получить полный доступ к файловой системе устройства и изменять системные файлы или же вытянуть важную информацию, когда ваш девайс завис на загрузке. Все функции режима отладки описывать не буду т.к. моя цель донести общую информацию, а не подробный обзор о функциях того или иного режима.

Читайте также:  Find android sdk path android studio

Архитектура файлов и папок системы ОС Android

Разобравшись с теорией, давайте запустим Андроид ОС.

Нажимаем кнопку питания — запускается Bootloader, который загружает Ядро (boot), оно, в свою очередь, запускает систему (System), ну, а она уже подгружает программы (data) и пользовательское пространство (user). (Рис.3)

А теперь перейдем в корневой каталог и посмотрим на внутренности самой Android OS:

В этой схеме мы привели, только необходимые для ознакомления, директории. На самом деле их гораздо больше и на обзор только одной папки System понадобится целая статья.

И так, папка data. Как можно догадаться из названия, она как-то связана с данными, но с какими? Да практически со всеми, это и данные о синхронизации и аккаунтах, пароли к точкам доступа wifi и настройки vpn, и так далее. Среди всего прочего тут можно обнаружить папки app, data и dalvik-cache – рассмотрим их назначение:

  • app – сюда устанавливаются программы и игры.
  • data – здесь хранятся данные приложений, их настройки, сэйвы игр и прочая информация.
  • dalvik-cache — программная область кэш-памяти для программы Dalvik. Dalvik это Java-виртуальная машина, которая является основой для работы программ, имеющих *.apk расширение.
  • Для того, чтобы сделать запуск программ быстрее — создается их кэш.

Папка System хранит в себе системные данные и все необходимое для работы ОС. Давайте рассмотрим некоторые из этих папок:

  • app – здесь находятся системные приложения (смс, телефон, календарь, настройки и т.п.), а так же приложения установленные производителем устройства (фирменные виджеты, живые обои и т.д.).
  • fonts – системные шрифты
  • media – содержит стандартные мелодии звонков, уведомлений, будильников и звуков интерфейса, а так же загрузочную анимацию (bootanimation)
  • build.prop – Этот файл упоминается, чуть ли не первым, в разговорах и статьях о тонкой настройке системы. В нем содержится огромное количество настроек, таких как плотность экрана, время задержки сенсора приближения, управление wifi, имя и производитель устройства и многие другие параметры.

Права суперпользователя Root в ОС Android

Как и в любой Linux-подобной системе, в операционной системе Android доступ к системным файлам и директориям осуществляется при наличии прав суперпользователя Root. В даном разделе мы решили рассмотреть принцип работы прав суперпользователя ОС Android, возможность редактирования системных файлов или логических разделов файлового пространства при наличии прав суперпользователя Root.

— Знать что в какой папке это хорошо, но можно ли что-то с этим сделать?

— Да! Но нужны права суперпользователя (root) или, если проводить аналогию с Windows, права Администратора. Изначально все устройства на Андроид идут без root прав для конечного пользователя, т.е. покупая девайс, мы не являемся в нем полноценными хозяевами. Это сделано как для защиты от вредоносных программ, так и от самого пользователя – ведь, в неумелых руках, полный доступ к системе может привести к «смерти» операционной системы и последующей необходимости в перепрошивке устройства.

«Ну и в чем польза такой опасной штуки?» — спросите Вы.

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

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

— Это все здорово, но теперь любая программа сможет получить доступ к «сердцу» операционки и моим данным?

— Нет. Вы сами решаете разрешить, тому или иному приложению, получить root доступ, или нет. Для этого существует программа Superuser или ее продвинутая сестра SuperSU. Без этой или подобной программы воспользоваться root не возможно.

Как видите, Андроид не такая уж и сложная операционная система для понимания пользователя. Если вы ранее имели опыт работы с Linux-подобными операционными системами, вы найдете много схожего с Android системами и это сходство обосновано. Android система является производной и построенной на базе ядра Linux. Надеюсь, после прочтения статьи, вы узнали что-то новое или получили ответ на давно интересовавший вопрос.

Источник

Запуск ОС Андроид с SD-карты для устройств на процессоре Amlogic S912

В статье детально, с приведением исходного кода, описывается работа, проведенная по переносу и запуску с SD-карты программной прошивки с ОС Андроид для устройств на процессоре Amlogic S912.

Мне нравятся миниатюрные компьютеры, выполненные по технологии система на чипе (SOC). За крошечные размеры и небольшое энергопотребление по сравнению с персональными компьютерами. Используя такие устройства, можно решать широкий круг задач. На миникомпьютеры можно установить как ОС Android (так делает большинство производителей данных «игрушек»), так и различные дистрибутивы Linux или Chrome OS.

Читайте также:  Highscreen fest xl pro прошивка андроид 9

Моя текущая работа — это разработка приложений для Андроид. В этой работе очень желательны тесты на реальных устройствах на различных версиях системы. Есть у меня пара миникомпьютеров от компаний Rockchip и Amlogic, на которых я также выполняю свои тесты. Андроид, как операционная система, довольно динамично развивается и сейчас на рынке используются ее модификации от 4.4 до 10 версии. А на подходе уже Андроид 11-й версии.

Многие компании, занимающиеся разработкой телеприставок на базе Андроид, вынуждены иметь недолгий срок сопровождения свои детищ в виду быстрого развития как аппаратных, так и программных средств. Один из моих основных рабочих инструментов для тестов — это приставка KM8P на процессоре S912 с двумя гигабайтами ОЗУ и предустановленной операционной системой Андроид версии 7.1. Время идет, и за пару-тройку лет на рынке последовательно появились версии 8.1, 9.0 и 10.0 ОС Андроид.

Очень хотелось бы потестировать свое приложение под этими самыми версиями. Но что делать? Или нужно покупать зверушки на новых процессорах и версиях Андроид, или заниматься самостоятельной адаптацией новых версий Андроида на имеющихся устройствах. Первый путь легок и прост: заплатив не очень большую сумму, проблема легко решается. Но легких путей мы не ищем, поэтому выбираем второй путь. Второй путь гораздо труднее, но интереснее. К тому же, и сам чип S912 является отличным 8-ядерным процессором, не намного уступающим по производительности новейшим процессорам Amlogic на чипе S905x.

Итак, был выбран второй вариант, как более интересный и отвечающий моим потребностям. Встал вопрос: а каким путем пойти? Текущая версия Андроид 7.1 под капотом имеет ядро Linux 3.14.29 и ПЗУ NAND на чипе SK Hynix H27UCG8T2ETR, для которого Amlogic разработала собственный драйвер aml_nftl_dev.ko.

Все новейшие версии Андроид базируются на ядре 4.9. И желательно использовать именно его. Однако, политика Amlogic такова, что последние несколько лет SDK Android компания предоставляет только юридическим компаниям, занимающимся производством устройств на базе чипов Amlogic.

Тем не менее, на просторах github’а можно найти исходники ядра 4.9 на основе SDK Android от Amlogic 2017-18 года. Например, git-репозитарий компании Khadas. Однако, дело, в том, что драйвер aml_nftl_dev для версии ядра 4.9 отсутствует. Что делать? Адаптировать данный драйвер для ядра 4.9? Но помимо адаптации драйвера, придется также править так называемое дерево устройств ядра. Это трудный путь.

Множество устройств на процессоре S912 имеет более современное ПЗУ с контроллером EMMC. К счастью, для обладателей таких устройств совсем недавно (в июне-июле 2020 года) появились прошивки на Андроид 9, собранные энтузиастами (ознакомиться можно здесь и здесь). Я не мог воспользоваться данными прошивками в виду отсутствия на моем устройстве чипа EMMC. Однако, прекрасно понимал, что имея на приставке слот для SD-карточки, для работы с которым используется все тот же драйвер MMC, что и для работы с микросхемой EMMC, можно попытаться использовать SD-карту вместо ПЗУ.

К сожалению, ситуация осложнялась тем, что Amlogic изначально не предусмотрел старт системы с SD-карты. Тем не менее, кое-что было. Amlogic реализовала возможность обновления прошивок с SD-карты. Эта и другие возможности были достигнуты компанией Amlogic путем существенной доработки загрузчика u-boot под свои нужды. В частности, имеется возможность запустить ядро системы с FAT-раздела SD-карты. Итак, было принято решение выяснить, можно ли адаптировать драйвер MMC для возможности старта с SD-карты. Я погрузился в изучение исходного кода драйвера.

Изучая исходный код, я выяснил, во-первых, что драйвер для монтирования загрузочного раздела ограничивается работой только с микросхемой EMMC, а остальные устройства игнорирует. А такими устройствами как раз является SDMMC-слот и SDIO-порт. А почему бы не изменить код так, чтобы драйвер не пропускал устройство SDMMC, а продолжал бы с ним работать, как с EMMC?

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

Получается, что разрешив драйверу работать с SDMMC, как с EMMC и записав таблицу разделов по заранее известному адресу на SD-карте, я смогу, таким образом, сымитировать EMMC и загрузить систему с SD-карты! Подумал, почему бы не сделать утилиту, которая будет записывать таблицу разделов в нужном формате и при необходимости проверять ее корректность. Сказано — сделано. Тем более, что сделать ее было несложно, благо практически вся инфраструктура уже была описана в исходном коде драйвера. Исходный код утилиты размещен на github’е, репозиторий amlpt. Утилита создана в ОС Ubuntu. Но, думаю, при необходимости, ее не сложно будет перенести и на Windows.

Для начала нужно заполнить параметры таблицы разделов в файле mmcparts_a9.c, указав там имена, смещения, размеры и тип разделов. Для обычных разделов указывается тип — 0x1, для разделов типа cache — 0x2, а для разделов типа data — 0x4. За начальное смещение первого раздела я взял значение 0x2800000 (40Мб). Далее заполнил имена, размеры и типы разделов в структурах partitions согласно таблице разделов из дерева устройств. Для 9-го Андроида таких разделов насчиталось 17.

Читайте также:  Впн для андроид подключение

Заполнив данные в файле mmcparts_a9.c, создаем утилиту для записи таблицы разделов, запустив скрипт make_amlptwrt.sh. Данный скрипт создает исполняемый файл amlptwrt, с помощью которого можно сформировать двоичный файл mmc_parts.bin. Это и есть наша таблица разделов, которую читает драйвер MMC. Аналогично запускаем скрипт make_amlptrdr.sh для создания утилиты чтения таблицы разделов amlptrdr, с помощью которой мы можем проверить правильность заполнения данной таблицы. После запуска amlptrdr в консоли отобразится таблица разделов с именами, смещениями и размерами в мегабайтах. Примерно так:

/AML/amlpt$ ./amlptrdr
[mmc_verify_partition_tbl] mmc read partition OK!
show_mmc_partitions
[disk p01] logo offset 40 Mb, size 8 Mb
[disk p02] recovery offset 48 Mb, size 24 Mb
[disk p03] misc offset 72 Mb, size 8 Mb
[disk p04] dtbo offset 80 Mb, size 8 Mb
[disk p05] cri_data offset 88 Mb, size 8 Mb
[disk p06] rsv offset 96 Mb, size 16 Mb
[disk p07] metadata offset 112 Mb, size 16 Mb
[disk p08] vbmeta offset 128 Mb, size 2 Mb
[disk p09] param offset 130 Mb, size 16 Mb
[disk p10] boot offset 146 Mb, size 16 Mb
[disk p11] tee offset 162 Mb, size 32 Mb
[disk p12] vendor offset 194 Mb, size 130 Mb
[disk p13] odm offset 324 Mb, size 128 Mb
[disk p14] system offset 452 Mb, size 1350 Mb
[disk p15] product offset 1802 Mb, size 128 Mb
[disk p16] cache offset 1930 Mb, size 1120 Mb
[disk p17] data offset 3050 Mb, size 4050 Mb

Для того, чтобы драйвер MMC заработал с устройством SDMMC, я внес два небольших исправления в исходный код драйвера, в файл drivers/amlogic/mmc/emmc_partitions.c:

а) Во-первых, разрешаем драйверу работать с устройствами, отличными от EMMC. Для этого меняем функцию is_card_emmc следующим образом:

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

б) Определяем смещение, по которому будет читаться таблица разделов. Правку делаем в функции mmc_read_partition_tbl:

Если посмотрим на исходный код драйвера, то сумма констант MMC_BOOT_PARTITION_SIZE + MMC_BOOT_PARTITION_RESERVED равна 36 Мб. Следует отметить, что данные правки подходят для моего варианта, когда в устройстве отсутствует чип EMMC или в дереве устройств он отключен. Для других случаев придется придумывать более корректный вариант правок.

Итак, смещение, по которому будет записана таблица разделов на SD-карте равна 36 Мб. Для того, чтобы разместить нашу таблицу разделов, созданную утилитой amlptwrt, на SD-карте достаточно выполнить команду:

При этом предполагается, что /dev/sdb — это SD-карта.

Далее компилируем ядро, создаем boot.img с нулевым initrd и примерно такими параметрами ядра:

Вспомним, что u-boot от Amlogic умеет стартовать ядро Linux c SD-карты с раздела FAT. Создаем на SD-карте в самом начале раздел FAT размером 32 Мб. Этого вполне достаточно для размещения нашего boot.img и dtb.img. В дереве устройств dtb.img необходимо отключить EMMC, чтобы нашей SD-карте было присвоено имя /dev/mmcblk0. Или не отключать, но тогда нужно будет изменить в boot.img параметры ядра, чтобы ядро смогло успешно подключить системный раздел, который в данном случае будет иметь имя /dev/mmcblk0p14.
И, как заключительная часть марлезонского балета, осталось записать разделы Андроид-прошивки на SD-карту. Для этого распаковываем прошивку и записываем на SD-карту подходящие разделы согласно смещениям в таблице разделов:

Те разделы, которые отсутствуют в прошивке, я просто заполнял нулями. Некоторые разделы, такие как system или vendor и некоторые другие, могут являться sparse-разделами. Их предварительно необходимо преобразовать в обычные разделы:

С разделами cache и data нужно поступить немного по-другому. Смотрим нашу таблицу разделов, созданную утилитой amlptwrt, и с помощью программы fdisk создаем соответствующие разделы с нужными смещениями и размерами на SD-карте и форматируем их в файловую систему ext4:

После форматирования, с помощью той же утилиты fdisk, удаляем уже ненужные разделы /dev/sdb2 и /dev/sdb3.

Чтобы загрузчик u-boot распознал, что нужно загрузиться именно с SD-карты, размещаем в FAT-разделе файл aml_autoscript. Сам файл aml_autoscript может быть создан с помощью утилиты mkimage из простого текстового файла следующего содержания:

Вот и все, что необходимо для переноса прошивки с Андроид на борту на SD-карту.

Несколько прошивок, которые были сделаны по данному методу, опубликованы в соответствующей теме на форуме 4PDA. Если что-то непонятно, задавайте вопросы в комментариях. Чем смогу — помогу.

За сим позвольте откланяться и удачи всем в переносе прошивок!

Источник

Оцените статью