Какой процесс загрузки для ARM? - PullRequest
50 голосов
/ 26 мая 2011

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

Ответы [ 3 ]

60 голосов
/ 26 мая 2011

В настоящее время в архитектуре ARM есть две модели исключений (сброс считается своего рода исключением):

Классическая модель, используемая в чипах 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, что часто реализуется как тесно связанный диапазон памяти для самой быстрой обработки исключений. Однако сброс при включении питания обычно начинается с 0x00000000 (но в некоторых микросхемах можно установить 0xFFFF0000 с помощью контакта процессора).

Новая модель микроконтроллера используется в линейке микросхем Cortex-M. Там таблица векторов в 0 на самом деле является таблицей векторов (указателей), а не инструкций. Первая запись содержит начальное значение для регистра SP, вторая - вектор сброса. Это позволяет писать обработчик сброса непосредственно в 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, первым исполняемым фрагментом кода обычно является не код пользователя, а встроенное загрузочное ПЗУ. Он может проверять различные условия, чтобы определить, откуда загружать код пользователя и нужно ли его вообще загружать (например, для этого может потребоваться действительная цифровая подпись). В таких случаях пользовательский код может соответствовать различным соглашениям при запуске.

3 голосов
/ 27 октября 2015

... В конце код ОС начинает работать. Для архитектуры ARM, каков процесс загрузки после использования, нажмите кнопку питания?

Этот ответ в основном в контексте современных процессоров Cortex-A; Существует большое разнообразие платформ ARM. Однако для ARM, подобного ПК (планшет, мобильный телефон и т. Д.) ...

Процессор ARM будет извлекать инструкцию из 0x0 или 0xffff0000 (для Cortex-M это данные, а не инструкция). Типичные ARM SOC имеют загрузочный диск, который использует этот механизм. Для конечного пользователя вам нужно обратиться к руководству, чтобы определить, как заставить ваш код работать. То есть существует BIOS , встроенный во многие ARM SOC, которые используют вектор, но вам нужно использовать что-то другое, чтобы ваш код работал.

Обычно ARM SOC поддерживает несколько загрузочных устройств. Устройство определяется каким-либо FUSE (установленным производственным инструментом) или штырьками для отбора проб. Контакты будут выходами ЦП в работающей системе, но были подтянуты вверх / вниз для настройки загрузочного устройства. Каждое загрузочное устройство будет иметь специфические детали; ROM прост, но NAND flash, SPI flash, MMC и т. Д. Нуждаются в некоторых деталях конфигурации. Они также часто обеспечиваются встроенным FUSE и / или штырьками для отбора проб. Небольшая часть устройства может быть прочитана для дальнейшей настройки устройства.

Для глубоко встроенного чипа ARM он может загружаться только с встроенной флэш-памяти, и этот процесс намного проще; но я полагаю, что в контексте вопроса вы имеете в виду более продвинутые процессоры ARM. Более продвинутые системы ARM имеют загрузчик. Это связано с тем, что объем кода, загружаемого загрузчиком ПЗУ, часто ограничен и / или ограничен. Также часто бывает сложно настроить SDRAM, и загрузчик может быть структурирован для работы из внутренней статической памяти, которая конфигурирует SDRAM.

См .: Зачем нам нужен загрузчик

Запуск ОС имеет свои особенности. Для ARM Linux это были ATAGS и теперь devicetree. Люди могут написать собственный загрузчик или использовать один из многих проектов с открытым исходным кодом, наиболее распространенным из которых является u-boot. U-boots поддерживает vxWorks, Linux, NetBSD, Plan9, OSE, QNX, Integrity и OpenRTOS, а также двоичные образы.

Многие оригинальные устройства ARM Linux поддерживали прямую загрузку Linux без загрузчика. Однако Linux не поддерживает этого в основной строке, за исключением нескольких очень старых ARM SOC / ядер.

3 голосов
/ 20 апреля 2014

После включения питания. Процессор начнет выполнять режим исключения. 1-й сбрасывается, так как сброс должен работать как режим супервизора, так как ЦП не знает состояние регистра в это время выполнения, он не может перейти в режим супервизора. Для достижения этого небольшой код должен быть написан (см. В конце). после этого другие исключения могут быть обработаны путем загрузки адреса в ПК.

.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
...