- Русские Блоги
- [Android6.0] [MTK6737] Анализ процесса запуска
- 1. Обзор процесса запуска
- 1. BootRom
- 2. Preloader
- 4. Kernel
- 5. Android
- 2. Загрузчик загрузчика
- 2.1 процесс запуска прелоадера
- 2.1.1 Функция прелоадера
- Аппаратная часть прелоадера
- 2.1.2 стартовый код preloader
- 2.2 Процесс запуска LK
- 2.2.1 Сценарий включения в LK
- 2.2.2 Сценарии зарядки в LK
- 2.2.3 Другие режимы запуска в LK
- 2.2.4 Код запуска LK
- Три, запуск ядра Linux
- 3.1 zРаспаковка изображения
- 3.2 start_kernel start
- 3.3 rest_init вызывает kernel_init
- В чем разница между Bootrom и загрузчиком на ARM-системах
- 2 ответов
- Bootrom
- загрузчика,
Русские Блоги
[Android6.0] [MTK6737] Анализ процесса запуска
1. Обзор процесса запуска
1. BootRom
Лечится внутри процессора.
отвечает за загрузку Preloader из внешней памяти.
отвечает за загрузку через USB.
2. Preloader
Принадлежит к первой части Bootloader.
Ответственный за лицензию MTK
отвечает за инициализацию базового модуля, такого как eMMC, PLL, DRAM и т. д.
отвечает за загрузку LittleKernel (LK)
Принадлежит ко второй части Bootloader.
отвечает за инициализацию устройства.
отвечает за загрузку ядра Linux.
поддерживает обновление fastboot.
4. Kernel
Отвечает за инициализацию устройства / инициализацию ядра.
отвечает за загрузку процесса инициализации режима ядра.
5. Android
Отвечает за руководство и запуск процесса инициализации пользовательского режима.
отвечает за запуск Zygote.
отвечает за инициализацию Framework и т. д.
Вышесказанное в основном можно разделить на три части: загрузчик (Preloader + LK), ядро, Android.
Позже мы будем анализировать код один за другим.
2. Загрузчик загрузчика
Основные функции загрузчика включают установку частоты процессора и памяти, указание порта отладочной информации и загрузочного запоминающего устройства. После создания исполняемой среды программное обеспечение загружается в память и запускается. В дополнение к загрузке программного обеспечения, внешние инструменты также могут пожать руку загрузчику, чтобы дать устройству команду перейти в различные режимы работы (например, режим загрузки USB и режим META). Даже если нет подтверждения от внешнего инструмента, загрузчик может войти в эти режимы, настроив кнопки.
Поскольку разные поставщики микросхем имеют относительно большие различия в упаковке ядер ARM, все разные процессоры Arm разрабатываются конкретным производителем микросхем процессора для загрузки при включении питания. Эта программа загрузки при включении питания обычно относительно проста и инициализирует оборудование и обеспечивает Режим загрузки и тд, а потом загрузите обычный загрузчик (uboot).
Для платформы MTK загрузчик разделен на две части
1. предварительный загрузчик, в зависимости от платформы.
2. LK (маленькое ядро), как и uboot, зависит от операционной системы, отвечающей за загрузку системы Linux и платформы Android.
Давайте подробнее рассмотрим предыдущий снимок.Процесс загрузкиДействия в разделе Bootloader:
1. Включите устройство, и BootROM начнет работать.
2. BootROM инициализирует программный стек (SoftwareStack), порт связи и загрузочное запоминающее устройство (NAND / EMMC).
3. BootROM загружает предварительный загрузчик из памяти во внутреннюю SRAM (ISRAM), поскольку внешняя DRAM еще не инициализирована.
4. BootROM переходит к записи предварительного загрузчика и выполняет ее.
5. Предварительный загрузчик инициализирует DRAM и загружает u-boot в RAM.
6. Предварительный загрузчик переходит на u-boot для выполнения, u-boot начинает инициализацию, например инициализацию дисплея.
7. u-boot загружает загрузочный образ из памяти, включая ядро Linux и ramdisk.
8. u-boot переходит к ядру Linux и выполняет его.
2.1 процесс запуска прелоадера
2.1.1 Функция прелоадера
- Отвечает за подготовку исполняемой среды на платформе набора микросхем.
- Если внешний инструмент обнаружен, он попытается пожать руку внешнему инструменту через uart или usb
- Загрузите u-boot из NAND / EMMC и перейдите к u-boot
- Используя инструментальное рукопожатие, устройство может запускаться для входа в режим загрузки для загрузки необходимого образа или входа в заводской / тестовый режим, такой как режим META и заводской режим ATE, в этих режимах модуль может быть протестирован или путем передачи загрузки параметры для U-Boot и ядра linux для калибровки устройства (калибровка устройства)
Аппаратная часть прелоадера
Модуль ФАПЧ
Настройте частоту процессора и внешней памяти. После инициализации модуля PLL частота процессора и внешней памяти увеличивается с 26MHZ / 26MHZ до 1GHZ / 192MHZ.
Модуль UART
используется для отладки или подтверждения в режиме META.
По умолчанию начальная скорость передачи UART4 составляет 9216000 бит / с для вывода отладочной информации.
UART1 инициализируется на 115200 бит / с и как порт по умолчанию для UART META. Однако UART1 также можно использовать как порт отладки или UART META.
Модуль таймера
используется для расчета времени задержки или тайм-аута, необходимого для аппаратного модуля.
Модуль памяти
Предварительный загрузчик загружается загрузочным ПЗУ и выполняется в SRAM внутри набора микросхем, поскольку внешняя DRAM не была инициализирована.
Затем предварительный загрузчик использует настройки встроенной памяти для инициализации DRAM, так что u-boot может быть загружен в DRAM и выполнен.
GPIO
PMIC
RTC
После включения кнопки питания предварительная загрузка поднимает PWBB RTC, чтобы устройство всегда было под напряжением, и продолжала загружать u-boot.
Аварийный сигнал RTC может быть источником запуска для запуска устройства. В этом случае устройство может запуститься автоматически без нажатия кнопки питания.
USB
NAND
MSDC
предзагрузчик может загружать u-boot из NAND Flash или EMMC, выберите один из двух
2.1.2 стартовый код preloader
Кодовый поток выглядит следующим образом:
2.2 Процесс запуска LK
LK (Little Kernel) — тоже своего рода загрузчик, похожий на u-boot.
MTK управляется и выполняется предварительным загрузчиком. Поскольку аппаратные модули были завершены в предварительном загрузчике, нет необходимости перенастраивать эти модули в lk. Но некоторые модули будут снова сброшены в lk для настройки аппаратных регистров, что может создать чистую среду. Например, в модуле таймера в lk таймер сбрасывается, чтобы сбросить аппаратный счетчик, чтобы сбросить время.
2.2.1 Сценарий включения в LK
После загрузки LK аккумулятор проверит, нажата ли кнопка включения,
Если причиной текущего запуска является зарядное устройство USB, а не кнопка питания, модуль батареи будет ждать, пока пользователь не нажмет кнопку питания для запуска;
key Указывает код клавиши, которую необходимо проверить. Возвращаемое значение указывает, нажата ли клавиша. Эта функция определяет, нажата ли указанная клавиша.
2.2.2 Сценарии зарядки в LK
2.2.3 Другие режимы запуска в LK
Factory mode
Заводской режим для массового производства
META mode
Режим META для функционального тестирования массового производства
Advanced META mode
Расширенный режим META, используемый для функционального тестирования во время массового производства, используемый для тестирования мультимедийных функций и начала сосуществования с Android.
Режим восстановления, используемый для обновления образа SD-карты
ATE Factory boot
Автоматический режим отображения тестовой среды. Отправляйте команды для тестирования функций продукта с помощью инструмента ATE ПК.
Alarm boot
Аварийный сигнал RTC активирован
Fastboot
Flash
download boot
При загрузке поддержка отображения логотипа
sw reboot
Причина запуска — перезапуск
2.2.4 Код запуска LK
Кодовый поток выглядит следующим образом:
Здесь будет создан поток bootstrap2
apps_init //\bootable\bootloader\lk\app\app.c
start_app
mt_boot_init //bootable\bootloader\lk\app\mt_boot\mt_boot.c
Если g_boot_mode — FASTBOOT, перейдите в режим быстрой загрузки.
в противном случае boot_linux_from_storage ()
boot_linux_from_storage () — это ключ
char g_CMDLINE[200] = COMMANDLINE_TO_KERNEL;
Этот COMMANDLINE_TO_KERNEL определен в \ lk \ include \ platform \ mt_reg_base.h
Три, запуск ядра Linux
Запуск ядра Linux обычно осуществляется с помощью внешнего загрузчика или загрузчика, который может быть встроен в головку.Эта часть тесно интегрирована с оборудованием и обычно пишется путем сборки.
3.1 zРаспаковка изображения
Распаковка ядра zImage
head.S сначала инициализируйте среду, связанную с самораспаковкой, такую как память, затем вызовите decopress_kernel для распаковки (./arch/arm/boot/compressed/misc.c)
3.2 start_kernel start
start_kernel запускает ядро (./init/main.c)
start_kernel — это общая функция инициализации для любой версии ядра Linux. Она инициализирует многие вещи, выводит информацию о версии Linux, устанавливает среду, связанную с архитектурой, инициализирует структуру таблицы страниц и установить систему в самозатухающий режим. Инициализировать IRQ системы, инициализировать основной планировщик и т. д.
Наконец, вызовите rest_init
3.3 rest_init вызывает kernel_init
Запустить процесс инициализации
Выполнить расписание, чтобы начать планирование задачи. Этот init компилируется из кода под ./system/core/init android, который вводит код android.
В чем разница между Bootrom и загрузчиком на ARM-системах
Я в основном исхожу из системного фона x86, где BIOS (прошивка) отвечает за загрузку загрузчика (например, GRUB) из PowerON, который, в свою очередь, загружает ОС. Теперь я читаю эквивалентную последовательность загрузки в системах ARM, и кажется, что в интернете есть статьи, содержащие ссылки на два термина: bootrom и bootloader.
в некоторых статьях упоминается, что из PowerON загрузчик (например, u-boot) является первым, что выполняется, тогда как некоторые статьи говорят, что от PowerON сначала выполняется bootrom (обычно мигающий на внутреннем ПЗУ процессора), который, в свою очередь, загружает загрузчик (например, uboot), который затем загружает ОС.
может ли кто — нибудь дать некоторые разъяснения по bootrom vs bootloader? Кроме того, я хотел бы знать имя популярного bootrom, который обычно используется в системах ARM.
2 ответов
вот как я понимаю термины.
Bootrom
Bootrom (или Boot ROM)-это небольшой фрагмент маски ROM или защищенной от записи вспышки, встроенной в чип процессора. Он содержит первый код, который выполняется процессором при включении питания или сбросе. В зависимости от конфигурации некоторых штырей ремня или внутренних предохранителей он может решить, откуда загрузить следующую часть кода для выполнения и как или проверить его на правильность или действительность. Иногда он может содержать дополнительные функции, возможно, используемые кодом пользователя во время или после загрузки. Некоторые примеры:
загрузочный диск iPhone. Встроенный в ПЗУ маски и не может быть изменен. Загружает загрузчик следующего этапа из flash или USB (в режиме DFU) и проверяет его подпись с помощью встроенной реализации RSA. Также предоставляет ускоренные функции дешифрования для загрузчика следующего этапа.
загрузочный диск OMAP4 TI. Смогите нагрузить код потребителя от вспышки (NOR, NAND, OneNAND), внешней памяти, SD/MMC, USB или UART. Порядок загрузки и параметры устанавливаются штифтами strap (SYSBOOT). Предоставляет некоторые функции для более поздних этапов (управление кэшем / TLB и т. д.)
загрузочный диск серии LPCxxxx NXP. Помещен в скрытую часть внутренней вспышки, которая отображается при 0 при включении питания. Реализует CRP (code read protection), ISP (in-System Programming), который позволяет загружать и мигать новый код через UART. Если указан допустимый код пользователя flash (должен иметь правильную контрольную сумму), сопоставляет ее с 0 и переходит к ней. Часть bootrom остается сопоставленной для предоставления IAP (in-Application Programming) и некоторых других служб.
загрузчика,
Bootloader отвечает за поиск и загрузку окончательной ОС или прошивки, которая должна работать на чипе. Одно из основных отличий от bootrom заключается в том, что он обычно доступен для записи flash и может быть заменен или обновлен.
иногда bootrom может выполнять работа загрузчика. Например, бутром OMAP достаточно сложен (он может анализировать FAT32!) что вы, вероятно, можете загрузить и запустить ядро Linux напрямую.
однако во многих случаях используется отдельный загрузчик, либо потому, что bootrom недостаточно способен (или отсутствует), либо потому, что необходима дополнительная гибкость. Это может быть очень просто (загрузить ядро из фиксированного места вспышки в ОЗУ и перейти к нему), или может быть намного сложнее. Например, U-Boot is a как мини-ОС сама по себе-она имеет консоль, некоторые команды, позволяет сломать процесс загрузки и, например, изменить аргументы командной строки ядра или даже загрузить ядро из другого места (SD/MMC или USB), запустить некоторые тесты и так далее.
загрузчики обычно используются, когда у вас есть более или менее сложная ОС, которая может понадобиться для ее запуска. Меньшие микроконтроллеры, такие как серия LPC NXP, обычно используют монолитную прошивку, поэтому они могут обойтись без нее (однако, может быть пользовательские загрузчики слишком для них).
на самых простых чипах может вообще не быть загрузочного ПЗУ или загрузчика — они просто пытаются получить и выполнить инструкции с фиксированного адреса запуска. На самом деле, большинство x86 чипов по сей день работают так — они просто начинают выполнять код в FFFFFFF0 с ожиданием, что чипсет сопоставил флэш-чип BIOS там. Здесь вы можете сказать, что BIOS является загрузчиком (хотя он также предоставляет услуги для ОС, аналогично bootrom).
процессоры ARM могут иметь flash ROM, т. е. маска чипа включает в себя некоторый код для загрузки BIOS. Много было сказано о том, что GPU выполняет большую часть последовательности загрузки, но у меня есть свои оговорки. Выполняет ли GPU код ARM? Нет. Итак, перед лицом официальной версии последовательности загрузки, я вижу из исходных данных GPU, 32K копируется в кэш L2 (так как DRAM не был включен), и с этого момента процессор запускает код для загрузки BIOS из SDRAM. Параметры Trustzone не включены в загрузке последовательность. Это позволяет голому металлическому кодеру (встроенным системам) использовать подавляющее большинство CPU FlashROM в качестве векторных таблиц, чтобы вы могли опросить оборудование и настроить векторы по мере необходимости. Материал TZ не имеет полезных свойств, так как набор Smurf доказывает, что он небезопасен. Но если вы используете это пространство для векторов, если кто-то перефразирует, ОС умирает.