ARM bootloader: Interrupt-Vektor-Tabelle Verständnis
Der folgende code ist der erste Teil der u-boot zu definieren interrupt-Vektor-Tabelle, und meine Frage ist, wie jede Zeile verwendet werden. Ich verstehe die ersten 2 Zeilen, die den Ausgangspunkt und den ersten Unterricht zu implementieren: reset, und wir definieren reset unten. Aber wenn wir diese Anweisungen unten? Je nach System.anzeigen, jeder Befehl hat eine Feste Adresse, so _fiq ist bei 0x0000001C, wenn wir ausführen möchten, fiq, wir kopieren diese Adresse in den pc und dann ausführen,richtig? Aber in welcher Weise können wir springen auf diese Anleitung: ldr pc, _fiq? Es realisiert in hardware oder durch software? Hoffe, ich mache mich richtig verstanden.
>.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
>_undefined_instruction: .word undefined_instruction
>_software_interrupt: .word software_interrupt
>_prefetch_abort: .word prefetch_abort
>_data_abort: .word data_abort
>_not_used: .word not_used
>_irq: .word irq
>_fiq: .word fiq
- Weiter denken: wir bereiten Sie zuerst jedem interrupt hier, dann starten Sie aus "start" oder "reset" - computer, die sind auch definiert als ein interrupt. Dann werden wir auch weiterhin die routine zurückgesetzt. Die folgenden interrupts sind nur eine Vorbereitung für zukünftige hardware - /software-interrupt. richtig?
ldr pc, _fiq
übersetztldr pc, [pc, #_fiq-offset]
. So ist das Wort Wert in _fiq geladen wird, in den PC. Ie legen Sie eine Funktion Zeiger auf die Adresse_fiq
. Um zu beginnen mit, es wird NULL sein; später können die Menschen Sie bevölkern. Interrupts nicht aktiviert sind, in u-Booten standardmäßig. Siehe: Aktivieren des interrupts im u-boot auf ARM.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie verstehen zurücksetzen, dann verstehen Sie alle von Ihnen.
Wenn der Prozessor zurückgesetzt wird, dann hardware setzt den pc auf 0x0000 und beginnt mit der Ausführung von abrufen der Instruktion bei 0x0000. Wenn eine nicht definierte Anweisung ausgeführt wird, oder versucht, die ausgeführt werden, die hardware reagiert durch die Einstellung des pc zu 0x0004 und beginnt mit der Ausführung der Anweisung in 0x0004. irq Interrupts, hardware-beendet den Unterricht, es ist die Ausführung beginnt mit der Ausführung der Instruktion auf Adresse 0x0018. und so weiter.
Nun natürlich zusätzlich zum ändern des pc und starten der Ausführung von diesen Adressen. Die hardware speichert den Zustand der Maschine, switch-Prozessor-Modi, wenn nötig, und starten Sie dann die Ausführung an die neue Adresse aus dem Vektor-Tabelle.
Unsere Aufgabe als Programmierer ist das erstellen der binary, so dass die Anweisungen, die wir sein wollen, führen Sie für jede dieser Anweisungen ist an der richtigen Adresse. Die hardware bietet ein Wort, eine Anweisung für jeden Standort. Nun, wenn Sie nie erwarten, dass jemals eine dieser Ausnahmen, die Sie nicht haben, um eine Verzweigung bei Adresse null zum Beispiel, können Sie einfach haben Sie Ihr Programm starten, es gibt nichts, Magie über die Erinnerung an diese Adressen. Wenn Sie erwarten, dass diese Ausnahmen, dann haben Sie zwei Möglichkeiten zur Auswahl-Anweisungen, die ein Wort und springen kann, aus dem Weg von der Ausnahme, dass folgt. Man ist ein Zweig der andere ist ein pc laden. Es gibt vor-und Nachteile zu jedem.
Werden, wenn die hardware übernimmt eine Ausnahme, der program counter (PC) wird automatisch auf die Adresse der entsprechenden exception-Vektor und der Prozessor beginnt die Ausführung von Anweisungen von dieser Adresse. Wenn der Prozessor kommt der reset, der PC automatisch auf
base+0
. Eine Undefinierte Anweisung setzt den PC zubase+4
usw. Die Basisadresse der Vektortabelle (base
) ist entweder 0x00000000, 0xFFFF0000, oderVBAR
je nach Prozessor und Konfiguration. Beachten Sie, dass diese begrenzte Flexibilität in dem die Vektor-Tabelle wird abgelegt, und Sie müssen zu konsultieren, die ARM-Dokumentation in Verbindung mit den Referenz-Handbuch für das Gerät, das Sie verwenden, um den richtigen Wert verwendet werden.Das layout der Tabelle (4 Byte pro Ausnahme) macht es notwendig, sofort Zweig von dem Vektor auf die eigentliche exception-handler. Die Gründe für die
LDR PC, label
Ansatz sind zweierlei - da ein PC-relative Niederlassung beschränkt ist (24 << 2) bits (+/-32MB) mitB
würde beschränken das layout der code im Speicher etwas; durch das laden einer absoluten Adresse der Hundeführer kann sich an einer beliebigen Stelle im Speicher. Zweitens macht es sehr einfach zu ändern exception-Handler zur Laufzeit, indem Sie einfach schriftlich eine andere Adresse zu, die Lage, anstatt Sie zu montieren und hotpatch ein Sprungbefehl.Gibt es wenig Wert zu einem remappable reset-Vektor auf diese Weise, jedoch, die ist, warum Sie neigen dazu, zu sehen, dass man realisiert, wie ein einfaches Zweig zu überspringen den rest der Vektoren der realen Einstiegspunkt code.