Na czym polega proces rozruchu ARM?

Jak wiemy, dla architektury X86: po naciśnięciu przycisku zasilania maszyna zaczyna wykonywać kod o wartości 0xFFFFFFF0, a następnie zaczyna wykonywać kod w BIOSie w celu dokonania sprzętowej inicjalizacji. Po uruchomieniu BIOS-u używa bootloadera, aby załadować obraz systemu operacyjnego do pamięci. Na końcu zaczyna działać kod systemu operacyjnego. W przypadku architektury ARM, jaki jest proces uruchamiania po naciśnięciu przycisku zasilania? Dzięki!

Author: Fengwei Zhang, 2011-05-26

3 answers

Obecnie istnieją dwa modele WYJĄTKÓW w architekturze ARM (reset jest uważany za rodzaj wyjątku):

Klasyczny model, stosowany w układach pre-Cortex i current Cortex-a / R. W pamięci o wartości 0 znajduje się kilka procedur obsługi wyjątków:
 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)

Gdy wystąpi wyjątek, procesor po prostu rozpoczyna wykonywanie od określonego przesunięcia, więc zwykle ta tabela zawiera gałęzie pojedynczych instrukcji do kompletnych programów obsługi w dalszej części kodu. Typowy klasyczny wektor tabela wygląda następująco:

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

W czasie wykonywania, tabela wektorowa może być przeniesiona do 0xffff0000, co jest często implementowane jako ściśle powiązany zakres pamięci dla najszybszej obsługi wyjątków. Jednak reset włączania zwykle rozpoczyna się od 0x00000000 (ale w niektórych układach można ustawić na 0xffff0000 przez pin procesora).

Nowy model mikrokontrolera jest używany w linii układów Cortex-M. Tam tabela wektorowa na 0 jest w rzeczywistości tabelą wektorów (wskaźników), a nie instrukcjami. Pierwszy wpis zawiera wartość początkową dla rejestru SP, drugi to wektor resetowania. Pozwala to na zapisanie funkcji obsługi resetowania bezpośrednio w C, ponieważ procesor ustawia stos. Ponownie, tabela może zostać przeniesiona w czasie wykonywania. Typowa tabela wektorowa dla Cortex-M zaczyna się tak:

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

Zauważ, że w nowoczesnych złożonych układach, takich jak OMAP3 lub A4 Apple, pierwszy kawałek kodu, który jest wykonywany, zwykle nie jest kodem użytkownika, ale ROM rozruchowy na chipie. Może sprawdzić różne warunki pozwalające określić, skąd wczytać kod użytkownika i czy w ogóle go załadować (np. może wymagać ważnego podpisu cyfrowego). W takich przypadkach kod użytkownika może być zgodny z różnymi konwencjami rozruchu.

 57
Author: Igor Skochinsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 13:25:50

Po Włączeniu zasilania procesor zacznie wykonywać exception mode pierwszy z nich jest resetowany, ponieważ Reset musi działać w trybie superviser, ponieważ procesor nie zna statusu rejestru w tym czasie wykonywania, nie może przejść do trybu superviser .aby osiągnąć ten mały kod należy napisać (patrz na końcu). po tym inne wyjątki mogą być obsługiwane przez załadowanie adresu do komputera .

.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
Author: user1813332,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-20 06:17:27

... Na końcu zaczyna działać kod systemu operacyjnego. W przypadku architektury ARM, jaki jest proces uruchamiania po naciśnięciu przycisku zasilania?

[1]} Ta odpowiedź jest głównie w kontekście lub nowoczesnych procesorów Cortex-a; istnieje wiele różnych platform ARM. Jednak dla ramienia, który jest podobny do komputera (tablet, telefon komórkowy itp.)...

PROCESOR ARM pobierze instrukcję z 0x0 lub 0xffff0000 (dla Cortex-M są to dane w przeciwieństwie do instrukcji). Typowe ARM SOC mają jakiś boot rom, który korzysta z tego mechanizmu. W przypadku użytkownika końcowego należy zapoznać się z instrukcją, aby ustalić, jak uruchomić kod. Ie, istnieje BIOS wbudowany w wiele SOC ARM, które używają wektora, ale musisz użyć czegoś innego, aby uruchomić kod.

ARM SOC zazwyczaj obsługuje wiele urządzeń rozruchowych. Urządzenie jest określane przez jakiś bezpiecznik (ustawiany przez narzędzie produkcyjne) lub przez kołki próbkowania. Piny będą wyjściami CPU w uruchomionym systemie, ale zostały wyciągnięte góra/dół, aby skonfigurować urządzenie rozruchowe. Każde urządzenie rozruchowe będzie miało osobliwe szczegóły; ROM jest prosty, ale NAND flash, SPI flash, MMC itp. Są one również często dostarczane przez bezpiecznik na chipie i / lub kołki próbkowania. Niewielka część urządzenia może być odczytana, aby jeszcze bardziej skonfigurować urządzenie.

W przypadku głęboko osadzonego układu ARM, może on uruchamiać się tylko z wbudowanej lampy błyskowej i proces ten jest znacznie prostszy; ale wierzę, że z kontekstu pytania, o którym mówisz, więcej zaawansowane procesory ARM. Bardziej zaawansowane systemy ARM mają boot loader. Dzieje się tak dlatego, że ilość kodu, który załaduje ROM loader, jest często ograniczona i/lub ograniczona. Konfiguracja SDRAM jest również często skomplikowana, a program ładujący może być skonstruowany tak, aby uruchamiał się z wewnętrznej statycznej pamięci RAM, która konfiguruje SDRAM.

Zobacz: Dlaczego potrzebujemy bootloadera

Uruchamianie systemu operacyjnego ma swoje osobliwe problemy. Dla ARM Linux był ATAGS i jest teraz devicetree. Ludzie mogą kodować tam własny boot loader lub użyć jednego z wielu projektów open-source z U-boot jest najczęściej. U-boots obsługuje vxWorks, Linux, NetBSD, Plan9, OSE, QNX, Integrity i OpenRTOS, a także obrazy binarne.

[1]}wiele oryginalnych urządzeń arm Linux obsługiwało bezpośrednie uruchamianie Linuksa bez boot loadera. Jednak Linux nie obsługuje tego w głównej linii z wyjątkiem kilku bardzo starych Soc/rdzeni ARM.
 3
Author: artless noise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:46