Как мы знаем, для архитектуры X86: после нажатия кнопки питания машина начинает выполнять код с 0xFFFFFFF0, затем начинает выполнять код в BIOS, чтобы выполнить инициализацию оборудования. После выполнения BIOS он использует загрузчик для загрузки образа ОС в память. В конце запускается код ОС. Для архитектуры ARM, какой процесс загрузки после использования нажмите кнопку питания? Спасибо!
Каков процесс загрузки для ARM?
Ответ 1
В настоящее время в архитектуре ARM есть две модели исключений (reset считается своего рода исключением):
Классическая модель, используемая в чипе pre-Cortex и чипах Cortex-A/R. В нем память в 0 содержит несколько обработчиков исключений:
Offset Handler
===============
00 Reset
04 Undefined Instruction
08 Supervisor Call (SVC)
0C Prefetch Abort
10 Data Abort
14 (Reserved)
18 Interrupt (IRQ)
1C Fast Interrupt (FIQ)
Когда происходит исключение, процессор только начинает выполнение с определенного смещения, поэтому обычно эта таблица содержит ветки с одной инструкцией для последующих обработчиков в коде. Типичная классическая таблица векторов выглядит следующим образом:
00000000 LDR PC, =Reset
00000004 LDR PC, =Undef
00000008 LDR PC, =SVC
0000000C LDR PC, =PrefAbort
00000010 LDR PC, =DataAbort
00000014 NOP
00000018 LDR PC, =IRQ
0000001C LDR PC, =FIQ
Во время выполнения векторная таблица может быть перенесена на 0xFFFF0000, которая часто реализуется как сильно связанный диапазон памяти для самой быстрой обработки исключений. Однако включение питания reset обычно начинается с 0x00000000 (но в некоторых чипах можно установить 0xFFFF0000 с помощью выводов процессора).
Новая модель микроконтроллера используется в линейке чипов Cortex-M. Там векторная таблица в 0 фактически является таблицей векторов (указателей), а не инструкциями. Первая запись содержит начальное значение для регистра SP, второе - это вектор reset. Это позволяет записывать обработчик reset непосредственно на C, поскольку процессор устанавливает стек. Опять же, таблица может быть перемещена во время выполнения. Типичная векторная таблица для Cortex-M начинается следующим образом:
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
[...more vectors...]
Обратите внимание, что в современных сложных чипах, таких как OMAP3 или Apple A4, первая часть кода, которая выполняется, обычно не является кодом пользователя, а встроенным загрузочным ПЗУ. Он может проверять различные условия, чтобы определить, где загрузить пользовательский код и загрузить его вообще (например, для его использования может потребоваться действительная цифровая подпись). В таких случаях код пользователя должен соответствовать различным соглашениям о запуске.
Ответ 2
После включения питания CPU начнет выполнение режима исключения. 1-й - reset, поскольку reset должен работать как режим супервизора, так как CPU не знает статус регистра в это время выполнения, он не может войти в режим супервизора. Для этого необходимо написать небольшой код (см. в конце). после этого другие исключения могут быть обработаны путем загрузки адреса на ПК.
.globl _start
_start: b reset
ldr pc, _undefined_instruction
ldr pc, _software_interrupt
ldr pc, _prefetch_abort
ldr pc, _data_abort
ldr pc, _not_used
ldr pc, _irq
ldr pc, _fiq
reset:
mrs r0,cpsr /* set the cpu to SVC32 mode */
bic r0,r0,#0x1f /* (superviser mode, M=10011) */
orr r0,r0,#0x13
msr cpsr,r0
Ответ 3
... В конце запускается код ОС. Для архитектуры ARM, какой процесс загрузки после использования нажмите кнопку питания?
Этот ответ в основном касается контекста или современных процессоров Cortex-A; существует большое количество платформ ARM. Тем не менее, для ARM, который похож на ПК (планшет, мобильный телефон и т.д.)...
CPU ARM будет извлекать инструкцию из 0x0 или 0xffff0000 (для Cortex-M это данные в отличие от команды). Типичный ARM SOC имеет некоторый загрузочный диск, который использует этот механизм. Для конечного пользователя вам необходимо обратиться к руководству, чтобы определить, как заставить ваш код работать. То есть, для многих ARM SOC используется BIOS, который использует вектор, но вам нужно использовать что-то другое, чтобы запустить ваш код.
Обычно ARM SOC поддерживает несколько загрузочных устройств. Устройство определяется некоторыми FUSE (установленными производственным инструментом) или с помощью пробоотборных штырей. Булавки будут выходами CPU в запущенной системе, но были выведены вверх/вниз, чтобы настроить загрузочное устройство. У каждого загрузочного устройства будут свои особенности; ROM прост, но NAND flash, SPI flash, MMC и т.д. Нуждаются в деталях конфигурации. Они также часто предоставляются встроенными FUSE и/или выводами для выборки. Возможно, потребуется небольшая часть устройства для дальнейшей настройки устройства.
Для глубоко встроенного чипа ARM он может загружаться только с бортовой вспышки, и этот процесс намного проще; но я считаю, что из контекста вопроса вы имеете в виду более сложные процессоры ARM. Более продвинутые системы ARM имеют загрузчик. Это связано с тем, что количество загружаемого модуля загрузчика ROM часто ограничено и/или ограничено. Также часто сложно настроить SDRAM, и загрузчик может быть структурирован для запуска из внутренней статической ОЗУ, которая настраивает SDRAM.
Смотрите: Почему нам нужен загрузчик
Запуск ОС имеет свои специфические проблемы. Для ARM Linux это был ATAGS, и теперь он девиз. Люди могут закодировать собственный загрузчик или использовать один из многих проектов с открытым исходным кодом, причем u-boot является наиболее распространенным. U-boots поддерживает vxWorks, Linux, NetBSD, Plan9, OSE, QNX, Integrity и OpenRTOS, а также двоичные образы.
Многие оригинальные устройства ARM Linux поддерживали прямую загрузку Linux без загрузчика. Однако Linux не поддерживает это в основной строке, за исключением нескольких очень старых ARM SOC/ядер.