it-swarm.com.de

Wie läuft der Startvorgang für ARM ab?

Wie wir wissen, für die X86-Architektur: Nachdem wir den Ein-/Ausschalter gedrückt haben, startet der Computer die Codeausführung bei 0xFFFFFFF0 und startet dann die Codeausführung im BIOS, um die Hardwareinitialisierung durchzuführen. Nach der BIOS-Ausführung wird das Betriebssystem-Image mit dem Bootloader in den Speicher geladen. Am Ende wird der OS-Code ausgeführt. Für ARM Architektur, was ist der Startvorgang nach dem Gebrauch drücken Sie den Ein-/Ausschalter? Danke!

51
Fengwei Zhang

Derzeit gibt es zwei Ausnahmemodelle in der ARM Architektur (Zurücksetzen wird als eine Art Ausnahme angesehen):

Das klassische Modell, das in Pre-Cortex-Chips und aktuellen Cortex-A/R-Chips verwendet wird. Darin enthält der Speicher bei 0 mehrere Ausnahmebehandler:

 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)

Wenn die Ausnahme eintritt, startet der Prozessor die Ausführung erst ab einem bestimmten Offset. In der Regel enthält diese Tabelle also Einzelanweisungsverzweigungen zu den vollständigen Handlern, die weiter im Code enthalten sind. Eine typische klassische Vektortabelle sieht folgendermaßen aus:

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

Zur Laufzeit kann die Vektortabelle in 0xFFFF0000 verschoben werden, was häufig als eng gekoppelter Speicherbereich für die schnellste Ausnahmebehandlung implementiert wird. Der Power-On-Reset beginnt jedoch normalerweise bei 0x00000000 (bei einigen Chips kann er jedoch durch einen Prozessor-Pin auf 0xFFFF0000 gesetzt werden).

Das neue Mikrocontrollermodell wird in der Cortex-M-Reihe von Chips verwendet. Dort ist die Vektortabelle bei 0 tatsächlich eine Tabelle von Vektoren (Zeigern), keine Anweisungen. Der erste Eintrag enthält den Startwert für das Register SP=, der zweite ist der Rücksetzvektor. Dadurch kann der Rücksetzhandler direkt in C geschrieben werden, da der Prozessor den Stapel aufbaut. Die Tabelle kann zur Laufzeit verschoben werden. Die typische Vektortabelle für Cortex-M beginnt wie folgt:

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

Beachten Sie, dass in modernen komplexen Chips wie OMAP3 oder Apples A4 der erste Code, der ausgeführt wird, normalerweise kein Benutzercode ist, sondern das On-Chip-Boot-ROM. Es könnte verschiedene Bedingungen prüfen, um zu bestimmen, woher der Benutzercode geladen werden soll und ob er überhaupt geladen werden soll (z. B. könnte eine gültige digitale Signatur erforderlich sein). In solchen Fällen muss der Benutzercode möglicherweise unterschiedlichen Startkonventionen entsprechen.

61
Igor Skochinsky

... Am Ende wird der OS-Code ausgeführt. Wie wird bei einer ARM Architektur nach der Verwendung der Netzschalter gebootet?

Diese Antwort bezieht sich hauptsächlich auf den Kontext moderner Cortex-A-CPUs. Es gibt eine große Auswahl an ARM Plattformen. Für ein ARM wie einen PC (Tablet, Handy usw.) ...

Die ARM CPU ruft einen Befehl entweder von 0x0 oder 0xffff0000 ab (für einen Cortex-M sind es Daten im Gegensatz zu einem Befehl). Typisch ARM= SOC Haben Sie ein Boot-ROM, das diesen Mechanismus verwendet. Für Endbenutzer müssen Sie ein Handbuch zu Rate ziehen, um festzustellen, wie der Code ausgeführt wird. Dh, es gibt ein [~ # ~] BIOS [~ # ~] eingebaut in viele ARM= SOC, die den Vektor verwenden, aber Sie müssen etwas anderes verwenden, um Ihren Code zum Laufen zu bringen.

In der Regel unterstützt der ARM SOC mehrere Startgeräte. Das Gerät wird durch eine Sicherung (von einem Fertigungswerkzeug festgelegt) oder durch Stichproben bestimmt. Die Stifte sind CPU-Ausgänge in einem laufenden System, aber wurden zum Konfigurieren eines Startgeräts nach oben/unten gezogen. Jedes Startgerät verfügt über besondere Details. ROM ist einfach, aber NAND-Flash SPI Flash, MMC usw. benötigen einige Konfigurationsdetails. Diese werden häufig auch von einer On-Chip-Sicherung und/oder Sampling-Pins bereitgestellt. Ein kleiner Teil des Geräts wird möglicherweise gelesen, um das Gerät weiter zu konfigurieren.

Für einen tief eingebetteten ARM Chip wird möglicherweise nur vom integrierten Flash gebootet, und dieser Vorgang ist viel einfacher, aber ich glaube, aus dem Kontext der Frage, auf die Sie sich beziehen, geht es um fortgeschrittenere ARM CPUs. Fortgeschrittenere ARM Systeme haben einen Bootloader. Dies liegt daran, dass die Menge an Code, die ein ROM Loader lädt, häufig ist eingeschränkt und/oder eingeschränkt Die Einrichtung des SDRAM ist häufig auch kompliziert, und der Bootloader kann so aufgebaut sein, dass er vom internen statischen RAM ausgeführt wird, der das SDRAM konfiguriert.

Siehe: Warum brauchen wir einen Bootloader

Das Ausführen des Betriebssystems hat seine eigenen Probleme. Für ARM Linux war es ATAGS und ist jetzt devicetree. Die Leute können dort ihren eigenen Bootloader programmieren oder eines der vielen Open-Source-Projekte verwenden, wobei U-Boot das gebräuchlichste ist. U-Boot Unterstützt vxWorks, Linux, NetBSD, Plan9, OSE, QNX, Integrity und OpenRTOS sowie binäre Images.

Viele ursprüngliche ARM Linux-Geräte unterstützten ein direktes Booten von Linux ohne Bootloader. Linux unterstützt dies jedoch nicht in der Hauptzeile mit Ausnahme einiger sehr alter ARM SOCs/Kerne.

3
artless noise

Nach dem Einschalten wird die CPU den Ausnahmemodus ausführen. Der erste Modus wird zurückgesetzt. Da Zurücksetzen als Überwachungsmodus ausgeführt werden muss, kann die CPU zum Zeitpunkt der Ausführung den Status des Registers nicht kennen und nicht in den Überwachungsmodus wechseln kleiner Code muss geschrieben werden (siehe am Ende). Danach können andere Ausnahmen behandelt werden, indem die Adresse in den PC geladen wird.

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