Подтвердить что ты не робот

Каков процесс загрузки для ARM?

Как мы знаем, для архитектуры X86: после нажатия кнопки питания машина начинает выполнять код с 0xFFFFFFF0, затем начинает выполнять код в BIOS, чтобы выполнить инициализацию оборудования. После выполнения BIOS он использует загрузчик для загрузки образа ОС в память. В конце запускается код ОС. Для архитектуры ARM, какой процесс загрузки после использования нажмите кнопку питания? Спасибо!

4b9b3361

Ответ 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/ядер.