Reboot to bootloader, что это?

Смартфон или планшет на Android – это, по сути, тот же компьютер, который и работает по похожим принципам. При включении у него также сначала стартует специальная программа, подобная компьютерному BIOS-у и происходит опрос имеющихся устройств. Лишь после этого запускается собственно операционная система, всю красоту которой мы видим на экране. На компьютере мы можем при старте компьютера нажать клавишу Delete или F2 и попасть в настройки BIOS, а уж там при желании можно много чего сделать. Но возможно ли это на смартфоне? Да, на большинстве устройств можно зайти в эти настройки до старта операционной системы, и сделать это очень просто.

Использование функции Reboot to Bootloader на устройствах Android.

Содержание

Что такое Reboot to Bootloader на устройстве с Android

В переводе с английского «bootloader» означает «загрузчик». Эта важнейшая часть программного обеспечения любого смартфона или планшета запускает ядро операционной системы и другие важные программы. Этот загрузчик срабатывает сразу после того, как вы включаете свой телефон, и он прошел этап тестирования. Работа его не видна, но очень важна. Слово «reboot» означает «перезагрузка». Что такое «reboot to bootloader» для Android в таком случае? Это значит промежуточный этап между стартом устройства и запуском загрузчика. Именно в этой точке вы находитесь, когда заходите в BIOS компьютера – он уже прошёл этап тестирования и вполне работает, но операционная система еще не запускалась. В смартфоне или планшете на базе Android тоже есть возможность войти в меню Reboot to Bootloader – эта функция так и называется. Для этого нужно выключить устройство, а затем включить его, удерживая одновременно кнопки включения и уменьшения громкости. На устройствах Samsung вместо громкости можно удерживать кнопку Home. На некоторых аппаратах эта функция заблокирована и войти в меню не получится. Используя возможности этой функции, вы действуете на свой страх и риск. Так можно безвозвратно испортить своё устройство!

Чем может быть полезна функция Reboot to Bootloader

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

Риски использования Reboot to Bootloader

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

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

Всё это означает, что использовать функцию Reboot to Bootloader может только лишь человек, обладающий нужными навыками и знаниями, а не обычный пользователь.

Это статья была написана для людей, которым всегда интересно знать как работают разные вещи. Для тех разработчиков которые обычно пишут свои программы на высоком уровне, C, C++ или Java — не важно, но при этом столкнулись с необходимостью сделать что-то на низком уровне. Мы будем рассматривать низкоуровневое программирование на примере работы bootloader-а.
Мы опишем что происходит после включения компьютера и как система загружается. В качестве практического примера, рассмотрим как вы можете написать свой собственный загрузчик, который фактически является отправной точкой при загрузки системы.

Что такое Boot Loader

Boot loader — это программа, которая записана на первом секторе жесткого диска. BIOS автоматически считывает всё содержимое первого сектора в память, сразу после включения питания. Первый сектор также называется главной загрузочной записью. На самом деле, это не является обязательным для первого сектора жесткого диска для загрузки чего либо. Это название было исторически сложившиеся, так как разработчики использовали такой механизм для загрузки операционной системы.

Будьте готовы погружаться глубже

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

И так, какой язык Вы должны знать, чтобы написать Boot Loader

В первую очереди, при работе компьютера, контроль аппаратного обеспечения осуществляется преимущественно посредством функций BIOS, известный как «прерывания». Вызвать прерывание можно только на ассемблере — будет здорово если вы хоть немного знакомы с этим языком. Но это не обязательное условие. Почему? Мы будем использовать технологию «смешанного кода», где можно совместить высокоуровневые конструкции с командами низкого уровня. Это не много упрощает нашу задачу.
В этой статье в основном будет использоваться язык C++. Но если вы знаете C, то вам будет легко узнать необходимые C++ элементы. В общем, даже знание языка C будет достаточно, но тогда вам придется изменять исходный код примеров.
Если вы знаете Java или C#, то к сожалению это не поможет для нашей задачи. Дело в том, что код Java и C#, который производится после компиляции является промежуточным. Специальная виртуальная машина используется, для последующей обработки(Java машину для Java и .NET для C#), преобразовывая промежуточный код в инструкции для процессора. После преобразования он может быть выполнен. Такая архитектура делает невозможным использование технологию смешанного кода — но мы будем использовать ее, чтобы сделать нашу жизнь проще, так что Java и C# здесь не помогут.
И так, для разработки простого загрузчика вы должны знать, C или C++, а также было бы не плохо если вы знаете немного Ассемблера.

Какой компилятор вам нужен

Чтобы использовать технологию смешанного кода, нужно по крайней мере два компилятора: для ассемблера и для C/C++, а также компоновщик который объединит объектные файлы(.obj) в один исполняемый файл.
Теперь, давайте поговорим о некоторых особых моментов. Есть два режима функционирования процессора: реальный и защищенный режим. Реальный режим является 16-битным и имеет некоторые ограничения. Защищенный режим является 32-битным и полностью используется операционной системой. Когда компьютер только начинает работу, процессор работает в 16-битном режиме. Таким образом, чтобы написать программу и получить исполняемый файл, вам понадобится компилятор и компоновщик для ассемблера для 16-битного режима. Для C/C++ вам потребуется только компилятор, который умеет создавать объектные файлы для 16-битного режима.
Современные компиляторы сделаны для 32-разрядных приложений, поэтому мы не сможем их использовать.
Я пробовал несколько бесплатных и коммерческих компиляторов для 16-битного режима и выбрал продукт от Microsoft. Компилятор вместе с компоновщиком для ассемблера, C и C++ включены в Microsoft Visual Studio 1.52, его можно скадать с официального сайта компании. Некоторые подробности о компиляторов которые нам нужны приведены ниже.
ML 6,15 — компилятор ассемблера от Microsoft для 16-битного режима.
LINK 5,16 — компоновщик, который умеет создавать COM-файлы для 16-битного режима.
CL — С, С++ компилятор для 16-битного режима.
Вы также можете использовать несколько альтернативных вариантов.
DMC — бесплатный компилятор для компиляции ассемблера, C, C++ для 16 и 32-битном режиме Digital Mars.
LINK — бесплатный компоновщик для компилятора DMC.
Есть также некоторые продукты от Borland.
BCC 3,5 — С, С++ компилятор, который умеет создавать файлы для 16-битного режима.
TASM — компилятор асемблера для 16-битного режима.
TLINK — компоновщик, который может создавать файлы COM для 16-битного режима.
Все примеры кода в этой статьи, были разработаны с инструментами от Microsoft.

Как система загружается

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

Рассмотрим кратко, как компоненты системы взаимодействуют при загрузке системы.
После того, как управление было передано по адресу 0000:7C00, Master Boot Record (MBR) начинает свою работу и запускает загрузку операционной системы.

Давайте перейдем к кодированию

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

Архитектура программы

Мы разрабатываем загрузчик для себя. Его задачами являются только следующие:

  1. Правильная загрузка в память по адресу 0000:7 C00.
  2. Вызов BootMain функции, которую мы написали в языке высокого уровня.
  3. Вывести на дисплей фразу — ”Hello, world…», from low-level.

Архитектура программы.
Первый объект это StartPoint, который написан исключительно в ассемблере, поскольку в языках высокого уровня нет необходимых нам инструкции. Это говорит компилятору, какой тип памяти должен использоваться, и адрес команды в RAM, которая должна выполняться после его чтения. Он также исправляет регистры процессора и передает управление функции BootMain, которая написано на языке высокого уровня.
Следующий объект- BootMain — является аналогом main, что, в свою очередь является основной функцией в которой сконцентрированы все функции программы.
Классы CDisplay и CString заботиться о функциональной части программы и выводит сообщение на экран. Как вы можете видеть на предыдущей картинки, класс CDisplay использует класс CString в своей работе.

Среда разработки

Здесь я использую стандартные среды разработки Microsoft Visual Studio 2005 или 2008. Вы можете использовать любые другие инструменты, но я уверен, что эти два, с некоторыми настройками, компилируют и работают легко и удобно.
Сначала мы должны создать проект Makefile Project, где будет выполнена основная работа.
File->New\Project->Общие\Makefile Project

BIOS прерывания и очистка экрана

Чтобы вывести сообщение на экране, мы должны очистить его для начала. Мы будем использовать специальные BIOS прерывания для этой цели.
BIOS предлагает ряд прерываний для работы с железом, таким как видеокарта, клавиатура, системный диск. Каждое прерывание имеет следующую структуру:
int ;
Где «number_of_interrupt» является числом прерывания.
Каждое прерывание имеет некоторое количество параметров, которые должны быть установлены до его вызова. Регистр процессора — ah, всегда несет ответственность за количество функций для текущего прерывания, и другие регистры обычно используются для других параметров текущей операции. Давайте посмотрим, как работа прерывания номер 10h выполняется на ассемблере. Мы будем использовать 00-функцию, она меняет видео режим и очищает экран:
mov al, 02h; настройка графического режима 80×25 (текст) mov ah, 00h; код функции изменения видео режима int 10h; вызов прерывания
Мы будем рассматривать только те прерывания и функции, которые будут использоваться в нашем приложении. Нам понадобится:
int 10h, function 00h – выполняет меняет видео режим и очищает экран; int 10h, function 01h – устанавливает тип курсора; int 10h, function 13h – показывает строку на экране;

«Смешанный код»

Компилятор C++ поддерживает встроенный Ассемблер, то есть при написании кода на языке высокого уровня вы можете также использовать язык низкого уровня. Инструкции ассемблера, которые используются на высоком уровне, также называют asm вставками. Они состоят из ключевого слова «__asm» и блока ассемблерных инструкций:
__asm ; ключевое слово, которое показывает начало ASM вставки { ; начало блока … ; какой нибудь ассемблеровский код } ; конец блока
Чтобы продемонстрировать пример смешанного кода мы будем использовать ранее упомянутый код на ассемблере, который выполняет очистку экрана и объединим его с кодом написанный на C++.
void ClearScreen() { __asm { mov al, 02h; настройка графического режима 80×25 (текст) mov ah, 00h; код функции изменения видео режима int 10h; вызов прерывания } }

CString реализация

CString класс предназначен для работы со строками. Он включает в себя метод Strlen(), который получает в качестве параметра указатель на строку и возвращает количество символов в этой строке.
CDisplay класс предназначен для работы с экраном. Он включает в себя несколько методов:

  1. TextOut() — выводит строку на экране.
  2. ShowCursor() — управляет курсором представления на экране: показать, скрыть.
  3. ClearScreen() — изменяет видео режим и таким образом очищает экран.

// CString.h #ifndef __CSTRING__ #define __CSTRING__ #include «Types.h» class CString { public: static byte Strlen(const char far* inStrSource); }; #endif // __CSTRING__ // CString.cpp #include «CString.h» byte CString::Strlen(const char far* inStrSource) { byte lenghtOfString = 0; while(*inStrSource++ != ‘\0’) { ++lenghtOfString; } return lenghtOfString; }

CDisplay — реализация

// CDisplay.h #ifndef __CDISPLAY__ #define __CDISPLAY__ // // colors for TextOut func // #define BLACK 0x0 #define BLUE 0x1 #define GREEN 0x2 #define CYAN 0x3 #define RED 0x4 #define MAGENTA 0x5 #define BROWN 0x6 #define GREY 0x7 #define DARK_GREY 0x8 #define LIGHT_BLUE 0x9 #define LIGHT_GREEN 0xA #define LIGHT_CYAN 0xB #define LIGHT_RED 0xC #define LIGHT_MAGENTA 0xD #define LIGHT_BROWN 0xE #define WHITE 0xF #include «Types.h» #include «CString.h» class CDisplay { public: static void ClearScreen(); static void TextOut( const char far* inStrSource, byte inX = 0, byte inY = 0, byte inBackgroundColor = BLACK, byte inTextColor = WHITE, bool inUpdateCursor = false ); static void ShowCursor( bool inMode ); }; #endif // __CDISPLAY__ // CDisplay.cpp #include «CDisplay.h» void CDisplay::TextOut( const char far* inStrSource, byte inX, byte inY, byte inBackgroundColor, byte inTextColor, bool inUpdateCursor ) { byte textAttribute = ((inTextColor) | (inBackgroundColor << 4)); byte lengthOfString = CString::Strlen(inStrSource); __asm { push bp mov al, inUpdateCursor xor bh, bh mov bl, textAttribute xor cx, cx mov cl, lengthOfString mov dh, inY mov dl, inX mov es, word ptr mov bp, word ptr mov ah, 13h int 10h pop bp } } void CDisplay::ClearScreen() { __asm { mov al, 02h mov ah, 00h int 10h } } void CDisplay::ShowCursor( bool inMode ) { byte flag = inMode ? 0 : 0x32; __asm { mov ch, flag mov cl, 0Ah mov ah, 01h int 10h } }

Types.h — реализация

Types.h является заголовочным файлом, который включает определения типов данных и макросов.
// Types.h #ifndef __TYPES__ #define __TYPES__ typedef unsigned char byte; typedef unsigned short word; typedef unsigned long dword; typedef char bool; #define true 0x1 #define false 0x0 #endif // __TYPES__

BootMain.cpp — реализация

BootMain() является основной функцией программы, которая является первой точкой входа (аналог main()). Основная работа проводится здесь.
// BootMain.cpp #include «CDisplay.h» #define HELLO_STR «\»Hello, world…\», from low-level…» extern «C» void BootMain() { CDisplay::ClearScreen(); CDisplay::ShowCursor(false); CDisplay::TextOut( HELLO_STR, 0, 0, BLACK, WHITE, false ); return; }

StartPoint.asm — реализация

;———————————————————— .286 ; CPU type ;———————————————————— .model TINY ; memory of model ;———————- EXTERNS —————————— extrn _BootMain:near ; prototype of C func ;———————————————————— ;———————————————————— .code org 07c00h ; for BootSector main: jmp short start ; go to main nop ;———————— CODE SEGMENT ———————— start: cli mov ax,cs ; Setup segment registers mov ds,ax ; Make DS correct mov es,ax ; Make ES correct mov ss,ax ; Make SS correct mov bp,7c00h mov sp,7c00h ; Setup a stack sti ; start the program call _BootMain ret END main ; End of program

Давайте соберем все

Создание COM файла

Теперь, когда код разработан мы должны преобразовать его в файл для 16-битных ОС. Такими файлами являются .COM-файлы. Мы можем запустить компилятор из командной строки, передавая необходимые параметры, в качестве результата мы получим несколько объектных файлов. Далее мы запускаем компоновщик для преобразования всех .COM файлов в один исполняемый файл с расширением. COM. Это работа способный вариант но не очень легок.
Давайте лучше автоматизируем этот процесс. Для этого нам нужно созать .bat файл и записать в нем нужные команды с необходимыми параметрами.
Поместите компиляторы и компоновщик в каталог проекта. В том же каталоге, мы создаем командный файл и заполняем в соответствии с примером (можно использовать любой каталог вместо VC152, главное чтобы компиляторы и компоновщик находились в нем).:
.\VC152\CL.EXE /AT /G2 /Gs /Gx /c /Zl *.cpp .\VC152\ML.EXE /AT /c *.asm .\VC152\LINK.EXE /T /NOD StartPoint.obj bootmain.obj cdisplay.obj cstring.obj del *.obj

Ассамблирование — автоматизация

В качестве заключительного этапа в этом разделе мы опишем как превратить Microsoft Visual Studio 2005, 2008, в среду разработки с поддержкой любого компилятора. Для этого нужно перейти в свойствах проекта: Project->Properties->Configuration Properties\General->Configuration Type.
Вкладка Configuration Properties включает в себя три пункта: General, Debugging и NMake. Выберите NMake и укажите путь к «build.bat» в Build Command Line и Rebuild Command Lin.
Если все сделано правильно, то вы можете скомпилировать нажав клавиши F7 или Ctrl + F7. При этом вся сопутствующие информация будет отображаться в окне вывода. Основным преимуществом здесь является не только автоматизация сборки, но и мониторинг ошибок в коде если они будут.

Тестирование и демонстрация

Этот раздел расскажет, как увидеть сделанный загрузчик в действии, как выполнить тестирование и отладку.

Как проверить загрузчик

Вы можете проверить загрузчик на реальном оборудовании или с использованием разработанных для этих целей виртуальных машинам — VMware. Тестирование на реальном оборудовании дает вам больше уверенности, что он работает также как и на виртуальной машине. Конечно, мы можем сказать, что VmWare отличный способ для тестирования и отладки. Мы рассмотрим оба метода.
Прежде всего, нужен инструмент, чтобы записать наш загрузчик на виртуальный или физический диск. Насколько я знаю, есть несколько бесплатных и коммерческих консолей и GUI приложений. Я использовал Disk Explorer для NTFS 3.66 (версия для FAT, называется Disk Explorer для FAT) для работы в ОС Windows и Norton Disk Editor 2002 для работы в MS-DOS.
Я опишу только Disk Explorer для NTFS 3,66 потому что это самый простой способ и подходит для наших целей больше всего.

Тестирование с помощью виртуальной машины VmWare

Создание виртуальной машины

Нам понадобится VmWare версия программы 5.0, 6.0 или выше. Чтобы проверить загрузчик мы создадим новую виртуальную машину с минимальным размером диска, например, 1 Gb. Отформатируйте его в файловую систему NTFS. Теперь нам нужно отобразить отформатированный жесткий диск на VmWare в качестве виртуального диска. Для этого выберите:
File->Map or Disconnect Virtual Disks…
После этого появится окно. Там вы должны нажать кнопку «Map». В следующем появившемся окне вы должны указать путь к диску. Теперь Вы также можете выбрать букву диска.
Не забудьте снять флажок «Open file in read-only mode (recommended)». После того как выполнили все выше описанные индикации диск должен быть доступен в режиме только для чтения чтобы избежать повреждения данных.
После этого мы можем работать с диском виртуальной машины, как с обычными логическим диском в ОС Windows. Теперь мы должны использовать Disk Explorer для NTFS 3,66 чтобы записать загрузочную запись с позиции 0.

Работа с Disk Explorer для NTFS

После запуска программы мы идем в наш диск (File-> Drive). В появившемся окне идем в раздел логические диски и выбираем наш созданный диск(в моем случае это Z).
Теперь мы выбираем меню пункт View как Hex команды. В это появившемся окне мы можем видеть информацию диска в 16-разрядном представлении, разделенная на сектора. Сейчас у нас только 0-ли, так как диск пуст, пока что.
Сейчас мы должны записать наш загрузчик в первый сектор. Мы устанавливаем маркер в положение 00, как это показано на предыдущей картинке. Чтобы скопировать загрузчик мы используем пункт меню Edit->Paste from file command. В открывшемся окне укажите путь к файлу и кликните Open. После этого содержимое первого сектора должен измениться и выглядеть, как это показано на картинке — если вы, конечно, ничего не меняли в коде.
Вы также должны записать подпись 55AAh по позиции 1FE от начала сектора. Если вы не сделаете это, BIOS проверит последние два байта, и не найдя указанную подписи, будет считать что этот сектор не является загрузочным и не загрузит его в память.
Для переключения в режим редактирования нажмите клавишу F2 и напишите необходимые номера — 55AAh подписи. Чтобы выйти из режима редактирования нажмите ESC.
Теперь нам нужно подтвердить записанные данные.
Чтобы применить записанное мы идем в Tools-> Options, теперь мы идем в пункт Mode и выбираем метод записывания — Virtual Write и нажмите кнопку Write.
Большую часть рутинных действий закончили, наконец, и теперь вы можете видеть, что мы разработали с самого начала этой статьи. Давайте вернемся к VwWare чтобы отключить виртуальный диск (File->Map or Disconnect Virtual Disks … and click Disconnect).
Давайте запустим виртуальную машину. Мы видим теперь, как из глубины царства машинных кодов появляются знакомые строки — «Hello World… «, from low-level…».

Тестирование на реальном оборудовании

Тестирование на реальном оборудовании почти такая же, как и на виртуальной машине, за исключением того, что если что-то не работает, вам потребуется намного больше времени, чтобы восстановить ее, чем создать новую виртуальную машину. Чтобы проверить загрузчик не имея возможность потерять данные (все может случиться), я предлагаю использовать флэш-накопитель, но сначала вы должны перезагрузить компьютер, зайдите в BIOS и убедитесь, что он поддерживает загрузку с флэш-накопителя. Если он поддерживает его, то все в порядке. Если нет, то вы должны ограничить тестированием на виртуальной тестовой машине.
Процесс написание загрузчика на флэш-диск в Disk Explorer для NTFS 3,66 такой же как и для виртуальной машины. Вы просто должны выбрать сам жесткий диск вместо своего логического раздела.

Заключение

В этой статье мы рассмотрели, что такое загрузчик, как работает BIOS, и как компоненты системы взаимодействуют при загрузке системы. Практическая часть дала нам понимание о том, как можно разработать свой собственный, простой загрузчик. Мы продемонстрировали технологию смешанного кода и процесс автоматизации сборки с использованием Microsoft Visual Studio 2005, 2008.
Конечно, это лишь малая часть по сравнению с огромной темой низкоуровневого программирования, но если вам было интересна это статья — то это круто.

В разделе recovery и в некоторых других приложениях доступна опция reboot to bootloader, что в переводе на русский означает «перезагрузка в режим загрузчика». Что это и зачем нужно, вы узнаете в этом материале.

Что такое reboot to bootloader на андроид

Это команда или по-другому функция, что переводит аппарат на Android в режим загрузчика. Опция встречается в консоли восстановления – recovery. В некоторых приложениях-инструментах загрузиться в загрузчик (bootloader) позволяет удержание определенной комбинации кнопок, различной для разных производителей.

Так же перевод смартфона в режим bootloader доступен в fastboot. Достаточно ввести команду fastboot reboot-bootloader, как смартфон или планшет перейдет в указанный режим.

Зачем запускать режим загрузчика

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

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

Вывод

Что значит reboot to bootloader, подробно описано в статье. Так же в материале указано, как попасть в загрузчик и зачем это нужно.