Multiboot android что это

Dual-boot – две прошивки одновременно

В последнее время появились ядра операционной системы Android, которые поддерживают dual-boot, то есть установку сразу двух прошивок с возможностью загрузки одной из них на выбор.

В данной статье мы разберемся, что такое dual-boot на 4-й версии ОС Android, что нужно для установки и работы двух прошивок, как их, собственно, установить, и некоторые полезные советы касательно использования такого мобильного устройства на практике.

В целом, dual-boot на Android это не открытие Америки, поддержка двух прошивок доступна некоторое время и вполне реальна. Для этого требуются ядра, которые имеют такую функцию. В данной статье за основу взято ядро под названием Siyah Kernel. Две прошивки позволяют настраивать и экспериментировать с прошивками, не затрагивая, например, основную стабильную. Вторая прошивка зависит только от ядра первой, в остальном же – автономна. Файловая система, впрочем, также «одна на двоих», что включает кэш, музыку, видео и изображения. Файлы второй прошивки скрыты во внутренней памяти, а потому недоступны при подключении Android-девайса к персональному компьютеру на второй прошивке. Само ядро Siyah Kernel также поддерживает функцию замены прошивок местами, то есть альтернативная ставится вместо основной, а основная наоборот, становится второй. Изменять настройки ядра отдельно нельзя, но прошивать апдейты, которые ядро не затрагивают, реально. В целом же, вторая прошивка живет независимо, то есть её можно легко заменить или удалить совсем, делать очистку отдельно для неё, а также создавать резервные копии и восстанавливать их, также применительно только к альтернативной второй прошивке.

Не забывайте создавать резервные копии, с которых вы сможете восстановиться, если вдруг что-либо пойдет не так. Как уже говорилось, dual-boot поддерживается несколькими ядрами, однако наиболее безопасным и стабильным касательно работы и управления 2nd ROM в данный момент является Siyah Kernel, и разбирать установку двух прошивок мы будем именно на данном примере.

Для установки и работы dual-boot потребуется: установленная прошивка на базе операционной системы Android 4-й версии, Root-права, упомянутое выше ядро Siyah Kernel последней версии, и больше 2.5 Гбайт свободного места в памяти мобильного устройства.

Всего существует три основных способа для установки дополнительной, то есть второй, пошивки на Android-девайс с ядром Siyah Kernel. Необходимо перезагрузиться в режиме Recovery (для этого включаем устройство с зажатием кнопок питания, «Домой» и уменьшения громкости). В меню будет видно пункт «Dual-boot options», его и следует открыть.

Способ первый. В «Dual-boot options» выбираем «Clone 1stROM to 2ndROM», таким образом текущая основная прошивка клонируется в 2ndROM, то есть становится альтернативной. После этого текущую прошивку можно заменить на какую-либо другую версии 4.*.*, но с таким же ядром, то есть Siyah Kernel. Возможно также обратно копировать альтернативную прошивку в основную, за это отвечает пункт «Clone 2ndROM to 1stROM».

Способ второй. Установка прошивки в .zip-архиве напрямую в 2ndROM. Для этого предварительно копируем нужную прошивку в память телефона или на карту памяти. После загрузки в режиме Recovery снова выбираем «Dual-boot options». Далее, выбираем пункт «Install zip to 2ndROM from internal SD», если копировали прошивку на встроенную память устройства, или «Install zip to 2ndROM from external SD», если прошивка находится на карте памяти. В файловой системе выбираем интересующий нас .zip-файл с прошивкой, и прошиваем наше Android-устройство.

Способ третий. Восстановление прошивки в 2ndROM из сохраненного Nandroid-бэкапа (ClockWorkMod). Если такового не имеется, то, естественно, сначала устанавливаем интересующую прошивку (ClockWorkMod, Recovery, Odin), после чего делаем бэкап (ClockWorkMod, Recovery). Восстанавливаем бэкап в 2ndROM. Входим в Recovery, пункт «Dual-boot options», выбираем «Restore as 2ndROM», если резервная копия находится на карте памяти, или же «Restore as 2ndROM from internal SD», если бэкап сохранен во внутреннюю память устройства. Выбираем файл резервной копии и устанавливаем прошивку. Очень желательно перед прошивкой сделать полную очистку 2ndROM, особенно если там ранее уже стояла какая-то другая прошивка: «Wipe 2ndROM data/cache» и «Wipe 2ndROM dalvik-cache».

Читайте также:  Сколько мне лет андроид

Теперь давайте разберемся с основными понятиями dual-boot. Как вы уже поняли, основная прошивка называется Primary ROM (1stROM), альтернативная вторая – Secondary ROM (2ndROM). 2ndROM расположена в директории sdCard/.secondrom/, сама папка скрыта (точка в начале названия), и содержит 2 файла – это и есть, собственно, прошивка. После установки второй прошивки, при запуске устройства или при его перезагрузке видно окошко с логотипом Siyah, при этом есть три секунды для запуска альтернативной прошивки. Для этого нажимаем кнопку «Домой» или понижение громкости, после чего 2ndROM будет загружен.

Приведем объяснение всех пунктов меню «Dual-boot options» в Recovery.

«View current status» – выводит статус второй прошивки, в том числе версию, сборку, модем, дату и так далее.

«Clone 1stROM to 2ndROM» — как уже говорилось выше, клонирование основной прошивки в альтернативную.

«Clone 2ndROM to 1stROM» — соответственно, клонирование альтернативной прошивки в основную.

«Remove 2ndROM» — полное удаление второй прошивки.

«Swap 1stROM and 2ndROM» — меняет прошивки местами, то есть основная становится альтернативной, а вторая, наоборот, основной.

«Install zip to 2ndROM from internal SD» — как разбирали немного выше, пункт, с помощью которого осуществляется установка прошивки в 2ndROM с внутреннего накопителя.

«Install zip to 2ndROM from external SD» — аналогично предыдущему пункту, но прошивка в 2ndROM устанавливается с карты памяти.

«Wipe 2ndROM data/cache» — вайп (иными словами, очистка) кэша.

«Wipe 2ndROM dalvik-cache» — вайп Dalvik-кэша.

«Fix 2ndROM permission» — установка или смена прав доступа (необходимый пункт для решения некоторых проблем, а именно в работе Root).

«Backup 2ndROM» — создание резервной копии второй прошивки с сохранением её на карту памяти.

«Restore as 2ndROM» — восстановление бэкапа в 2ndROM с карты памяти.

«Backup 2ndROM to internal SD» — создание резервной копии второй прошивки с сохранением её на внутреннем накопителе.

«Restore as 2ndROM from internal SD» — восстановление бэкапа в 2ndROM с карты памяти.

Если необходимо установить какой-либо мод, обновление или патч, который не затрагивает ядро (мод клавиатуры, Titanium Update, модификации из «Кухни» и так далее), на вторую прошивку, то делаем это при помощи пунктов «Install zip to 2ndROM from internal SD» и «Install zip to 2ndROM from external SD» из меню «Dual-boot options» в Recovery, для установки с внутренней памяти или флэш-карты соответственно.

Можно также совмещать программы и настройки основной и альтернативной прошивок, для этого используем Titanium Backup. Вместо того, чтобы заново устанавливать приложение во второй прошивке, восстанавливаем её через Titanium Backup из резервной копии. Таким же образом, если нужны настройки или конфигурация определенного приложения или лаунчера, перенос заметок и так далее, создаем бэкап в основной прошивке и восстанавливаем его в альтернативной. Через Titanium Backup можно настроить место хранения резервных копий одинаковым для основной и второй прошивок. Естественно, можно восстанавливать резервные копии и с 2ndROM в 1stROM.

Источник

Минимальный multiboot загрузчик

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

Я попытался объяснить всё в деталях и оставить код максимально простым, насколько это возможно. Если у вас возникли вопросы, предложения или какие-либо проблемы, пожалуйста, оставьте комментарий или создайте таску на GitHub . Исходный код доступен в репозитории.

Обзор

Когда вы включаете компьютер, он загружает BIOS из специальной флэш памяти. BIOS запускает тесты самопроверки и инициализацию аппаратного обеспечения, затем он ищет загрузочные устройства. Если было найдено хотя бы одно, он передаёт контроль загрузчику, который является небольшой частью запускаемого кода, сохранённого в начале устройства хранения. Загрузчик определяет местоположение образа ядра, находящегося на устройстве, и загружает его в память. Ему также необходимо переключить процессор в так называемый защищённый режим, потому что x86 процессоры по умолчанию стартуют в очень ограниченном реальном режиме (чтобы быть совместимыми с программами из 1978).

Читайте также:  Как выключить звук уведомлений андроид

Мы не будем писать загрузчик, потому что это сам по себе сложный проект (если вы действительно хотите это сделать, почитайте об этом здесь). Вместо этого мы будем использовать один из многих испытанных загрузчиков для загрузки нашего ядра с CD-ROM. Но какой?

Мультизагрузка

К счастью, есть стандарт загрузчика: спецификация мультизагрузки. Наше ядро должно лишь указать, что поддерживает спецификацию и любой совместимый загрузчик сможет загрузить его. Мы будем использовать спецификацию Multiboot 2 (PDF)
вместе с известным загрузчиком GRUB 2.

Чтобы сказать загрузчику о поддержке Multiboot 2 , наше ядро должно начинаться с заголовка мультизагрузки , который имеет следующий формат:

Field Type Value
магическое число u32 0xE85250D6
архитектура u32 0 для i386, 4 для MIPS
длина заголовка u32 общий размер заголовка включая тэги
контрольная сумма u32 -(магическое число + архитектура + длина заголовка)
тэги variable
завершающий тэг (u16, u16, u32) (0, 0, 8)

В переводе на x86 ассемблер это будет выглядеть так ( Intel синтаксис):

Если вы не знаете x86 ассемблер, то вот небольшая вводная:

  • заголовок будет записан в секцию, названную .multiboot_header (нам понадобится это позже),
  • header_start и header_end — это метки, которые указывают на месторасположение в памяти, мы используем их, чтобы вычислить длину заголовка,
  • dd означает define double (32bit) и dw означает define word (16bit). Они просто выводят указанные 32bit/16bit константы,
  • константа 0x100000000 в вычислении контрольной суммы — это небольшой хак, чтобы избежать предупреждений компилятора.

Мы уже можем собрать данный файл (который я назвал multiboot_header.asm ) используя nasm .

Следующая команда произведёт плоский двоичный файл, результирующий файл будет содержать 24 байта (в little endian , если вы работаете на x86 машине):

Загрузочный код

Чтобы загрузить наше ядро, мы должны добавить код, который сможет вызвать загрузчик. Давайте создадим файл boot.asm :

Здесь есть несколько новых команд:

  • global экспортирует метки (делает их публичными). Метка start будет входной точкой в наше ядро, она должна быть публичной,
  • .text секция — это секция по умолчанию для исполняемого кода,
  • bits 32 говорит о том, что следующие строки — это 32-битные инструкции. Это необходимо потому что процессор ещё находится в защищённом режиме, когда GRUB запускает наше ядро. Когда переключимся в Long mode в следующей статье, сможем запускать bits 64 (64-битные инструкции),
  • mov dword инструкция помещает 32-битную константу 0x2f4b2f4f в адрес памяти b8000 (это выводит OK на экран, объяснено будет в следующих статьях),
  • hlt — это инструкция, которая говорит процессору остановить выполнение команд.

После сборки, просмотра и дизассемблирования мы можем увидеть опкоды процессора в действии:

Создание исполняемого файла

Чтобы загрузить наш исполняемый файл позже через GRUB , он должен быть исполняемым ELF файлом. Поэтому необходимо с помощью nasm создать ELF объектные файлы вместо простых бинарников. Для этого мы просто добавляем в аргументы -f elf64 .

Для создания самого ELF исполняемого кода мы должны связать объектные файлы. Будем использовать кастомный скрипт для связывания, называемый linker.ld :

Переведём что написано на человеческий язык:

  • start — это точка входа, загрузчик перейдёт к этой метке после загрузки ядра,
  • . = 1M; уставливает адрес загрузки первой секции с 1-го мегабайта, это стандарт расположения для загрузки ядра,
  • исполняемая часть имеет две секции: в начале boot и .text после,
  • конечная секция .text будет содержать в себе все входящие секции .text ,
  • секции, именованные как .multiboot_header , будут добавлены в первую выходную секцию ( .boot ), чтобы они располагались в начале исполняемого кода. Это необходимо, потому что GRUB ожидает найти заголовок мультизагрузки в начале файла.

Давайте создадим ELF объектные файлы и слинкуем их, используя вышеуказанный линкер скрипт:

Очень важно передать -n (или —nmagic ) флаг линкеру, который отключает автоматическое выравнивание секций в исполняемом файле. В противном случае линкер может выравнить страницу секции .boot в исполняемом файле. Если это произойдёт, GRUB не сможет найти заголовок мультизагрузки, потому что он будет находиться уже не в начале.

Воспользуемся командой objdump для того, чтобы вывести секции сгенерированного исполняемого файла и проверить, что .boot секция имеет наименьшее смещение в файле:

Примечание: команды ld и objdump платформо-зависимы. Если вы работаете не на x86_64 архитектуре, вы нуждаетесь в кросс компиляции binutils. После этого воспользуйтесь x86_64‑elf‑ld и x86_64‑elf‑objdump вместо ld и objdump соответственно.

Создание ISO-образа

Все персональные компьютеры, работающие на базе BIOS , знают, как загружаться с CD-ROM, так что нам необходимо создать загружаемый образ CD-ROM, содержащий наше ядро и файлы загрузчика GRUB в единственном файле, называемом ISO. Создайте следующую структуру директорий и скопируйте kernel.bin в директорию boot :

grub.cfg указывает имя файла нашего ядра и совместимость с multiboot 2 . Выглядит это так:

Теперь мы можем создать загружаемый образ, используя следующую команду:

Примечание: вызов grub-mkrescue может вызвать проблемы на некоторых платформах. Если она у вас не сработала, попробуйте следующие шаги:

  • запустить команду с —verbose ,
  • удостовериться, что библиотека xorriso установлена ( xorriso или libisoburn пакет).

[loomaclin@loomaclin a_minimal_multiboot_kernel]$ yaourt xorriso
1 extra/libisoburn 1.4.8-2
frontend for libraries libburn and libisofs
==> Enter n° of packages to be installed (e.g., 1 2 3 or 1-3)
==> — ==> 1

[sudo] password for loomaclin:
resolving dependencies…
looking for conflicting packages.

Packages (3) libburn-1.4.8-1 libisofs-1.4.8-1 libisoburn-1.4.8-2

Total Download Size: 1.15 MiB
Total Installed Size: 3.09 MiB

Загрузка

Пришло время загрузить нашу ОС. Для этого воспользуемся QEMU:

Появится окно эмулятора:

Обратите внимание на зелёный текст OK в верхнем левом углу. Если у вас это не работает, посмотрите секцию комментариев.

Резюмируем, что произошло:

  1. BIOS загружает загрузчик (GRUB) из виртуального CD-ROM (ISO).
  2. Загрузчик прочёл исполняемый код ядра и нашёл заголовок мультизагрузки.
  3. Скопировал секцию .boot и .text в память (по адресу 0x100000 и 0x100020 ).
  4. Переместился к точке входа ( 0x100020 , это можно узнать вызвав objdump -f ).
  5. Ядро вывело на экран текст OK зелёным цветом и остановило процессор.

Вы также можете протестировать это на настоящем железе. Необходимо записать получившийся образ на диск или USB накопитель и загрузиться с него.

Автоматизация сборки

Сейчас необходимо вызывать 4 команды в правильном порядке каждый раз, когда мы меняем файл. Это плохо. Давайте автоматизируем этот процесс, с помощью Makefile. Но для начала мы должны создать подходящую структуру директорий чтобы отделить архитектурно-зависимые файлы:

Makefile должен иметь следующий вид:

Некоторые комментарии (если вы не работали до этого с make , посмотрите makefile туториал):

  • $(wildcard src/arch/$(arch)/*.asm) выбирает все файлы ассемблера в директории src/arch/$(arch) , так что вам не нужно обновлять Makefile при добавлении файлов,
  • операция patsubst для assembly_object_files просто переводит src/arch/$(arch)/XYZ.asm в build/arch/$(arch)/XYZ.o ,
  • таргеты сборки $ и $@ это автоматически выводимые переменные,
  • если вы используете кросс-комплированные binutils просто замените ld на x86_64-elf-ld .

Теперь мы можем вызвать make и все обновлённые файлы ассемблера будут скомпилированы и скомпонованы. Команда make iso также создаёт ISO образ, а make run в дополнение запускает QEMU.

Что дальше?

В следующей статье мы создадим таблицу страниц и проведем некоторую конфигурацию процессора для переключения в 64-битный long-mode режим.

Источник

Читайте также:  Система навител для андроид
Оцените статью