ARM: Start/Wakeup/Bringup die anderen CPU-Kerne/APs und passieren Sie die start-Adresse?
Ich habe schlug meinen Kopf mit diesem für die letzten 3-4 Tage und ich kann nicht finden, eine ANSTÄNDIGE Begründung Dokumentation (von ARM oder inoffiziell), um mir zu helfen.
Ich habe einen ODROID-XU board (big.WENIG 2 x Cortex-A15 + 2 x Cortex-A7) board und ich versuche zu verstehen, ein wenig mehr über die ARM-Architektur. In meinem "Experimentieren" code habe ich jetzt angekommen in der Phase, wo ich will AUFWACHEN, DIE ANDEREN KERNE AUS IHRER WFI (wait-for-interrupt) Zustand.
Die fehlenden Informationen versuche ich noch zu finden ist:
1. Wenn du die Basis-Adresse des memory-mapped-GIC-ich verstehe, dass ich brauche, um zu Lesen CBAR; Aber kein Teil der Dokumentation erklärt, wie die bits in CBAR (2 PERIPHBASE Werte) sollten so angeordnet sein, das Finale GIC-Basis-Adresse
2. Beim senden einer SGI-durch die GICD_SGIR registrieren, was die interrupt-ID zwischen 0 und 15 soll ich wählen? Spielt es eine Rolle?
3. Beim senden einer SGI-durch die GICD_SGIR registrieren, wie kann ich sagen, die anderen Kerne , WO Sie STARTEN Sie die AUSFÜHRUNG VON?
4. Wie wirkt sich die Tatsache, dass mein code geladen wird, indem der U-BOOT bootloader beeinflussen diesen Zusammenhang?
Den Cortex-A-Series Programmer ' s Guide v3.0 (gefunden hier: link) gibt die folgenden in Abschnitt 22.5.2 (SMP boot in Linux, Seite 271):
, Während der primäre Kern wird zu Booten, die sekundären Kerne werden in einem standby-Zustand, mit dem
WFI-Anweisung. Es (der primäre Kern) eine Start-Adresse für den sekundären Kerne und wecken Sie mit einem
Inter-Prozessor-Interrupt(IPI), das bedeutet eine SGI signalisiert durch die GIC
Wie macht Linux das? Die Dokumentation-S keine anderen details über "Es wird eine Start-Adresse für den sekundären Kerne".
Meine frustration wächst und ich wäre sehr dankbar für Antworten.
Vielen Dank im Voraus!
ZUSÄTZLICHE DETAILS
Dokumentation, die ich benutze:
- ARMv7-A&R Architecture Reference Manual
- - Cortex-A15-TRM (Technical Reference Manual)
- Cortex-A15 MPCore TRM
- Cortex-A-Series Programmer ' s Guide v3.0
- GICv2 Architektur Spezifikation
Was ich getan habe, von nun:
- UBOOT lädt mich auf 0x40008000; ich habe-Übersetzung-Tabellen (TTBs), geschrieben TTBR0 und TTBCR entsprechend und zugeordnet 0x40008000 zu 0x8000_0000 (2GB), so dass ich auch aktiviert die MMU
- Set-up-Ausnahme-Handler, die meine eigene
- Ich habe Printf-Funktionen über die serielle Schnittstelle (UART2 auf ODROID-XU)
Alle oben genannten scheint, richtig zu arbeiten.
Was ich versuche zu tun, nun:
- Holen Sie sich die GIC-Basis-Adresse => im moment lese ich CBAR und ich einfach UND (&) seinen Wert mit 0xFFFF8000 und verwenden Sie diese als die GIC-Basis-Adresse, obwohl ich bin mir fast sicher, dies ist nicht richtig
- Aktivieren der GIC-Verteiler (bei offset 0x1000 von GIC-Basis-Adresse?), durch das schreiben GICD_CTLR mit dem Wert 0x1
- Konstruieren eine SGI mit dem folgenden Parameter: Group = 0, ID = 0, TargetListFilter = "Alle CPUs Außer Mir" und senden Sie es (schreiben) durch die GICD_SGIR GIC registrieren
- Da ich nicht bestanden haben alle die start-Adresse für die anderen Kerne nichts passiert, nachdem diese
....UPDATE....
Habe ich begonnen zu suchen, auf dem Linux-kernel und QEMU source-codes, die auf der Suche nach einer Antwort. Hier ist, was ich herausgefunden habe (bitte korrigieren Sie mich, wenn ich falsch Liege):
- Beim Hochfahren das board ALLE KERNE starten das ausführen der reset-Vektor
- Eine software (firmware) Komponente führt WFI auf dem sekundären Kerne und einige andere code, der die Funktion eines Protokolls zwischen diesen sekundären Kerne und der primäre Kern, wenn Sie letzteres will, um Sie aufwachen, wieder
- Zum Beispiel, das Protokoll über die EnergyCore ECX-1000 (Highbank) board ist wie folgt:
**(1)** the secondary cores enter WFI and when
**(2)** the primary core sends an SGI to wake them up
**(3)** they check if the value at address (0x40 + 0x10 * coreid) is non-null;
**(4)** if it is non-null, they use it as an address to jump to (execute a BX)
**(5)** otherwise, they re-enter standby state, by re-executing WFI
**(6)** So, if I had an EnergyCore ECX-1000 board, I should write (0x40 + 0x10 * coreid) with the address I want each of the cores to jump to and send an SGI
Fragen:
- 1. Was ist die software-Komponente, die das tut? Liegt es an der BL1-binary, die ich geschrieben habe auf der SD-Karte, oder ist es das U-BOOT?
- 2. Von dem was ich verstehe, ist dieses software-Protokoll unterscheidet sich von board zu board. Ist das so, oder funktioniert es nur hängt von der zugrunde liegenden Prozessor?
- 3. Wo finde ich Informationen über dieses Protokoll abholen ein ARM-board? - finde ich es auf der offiziellen ARM-website oder auf der board-Seite?
- Ich glaube, dass diese Art der Initialisierung (d.h. aufwachen-die sekundären Kerne aus dem standby-Modus) erfolgt durch ROM-code die vorinstallierte vom chip-Hersteller (z.B. TI, Samsung, ...). Dies ist zum Beispiel, wie es gemacht wird in der TI OMAP ist. omappedia.org/wiki/Bootloader_Project
- Ich glaube, dass (offensichtlich) es muss einer der folgenden sein: ROM-code, BL1 code => beide unzugänglich (BL1 verschlüsselt [unterzeichnet]), oder den bootloader...habe ich ein wenig gesucht durch den bootloader Quellen, aber ich habe nicht gefunden eine Beziehung zu dieser SMP-Protokoll; plus, Linux scheint es nicht zu verlassen sich auf Argumente aus dem bootloader zu entdecken, das Protokoll (vielleicht durch einen ATAG), das führt mich zu glauben, dass das, was ich Suche, ist entweder in der ROM-code oder in der BL1-code...die Frage ist, welche und, da Sie inaccesible direkt, wo finde ich details darüber, was Sie tun, für mein board (ODROID-XU)...
- Ich nehme an, du meintest "also setzen die sekundären Kerne im standby"
- Diese Art von details versehen werden kann, durch irgendeine Art von Hersteller-SoC technischen Datenblatt. Deshalb würde ich zuerst versuchen, den Samsung Ressourcen, speziell Exynos 5. Ich konnte'f finden Sie die entsprechende Platte schnell genug, damit ich einen link zu ähnlichen OMAP-chip, nur um Ihnen eine Idee geben, wie TI behandelt diese Dinge.
- oh, glauben Sie mir, ich versuchte das auch; diese Liste habe ich hier gedruckt von Dokumentationen ist nicht vollständig: ich habe auch Exynos 5 Dual Bedienungsanleitung, suchte nach weiteren relevanten samsung-Dokumente...aber leider konnte ich nicht finden, die benötigten Informationen in Ihren docs; es ist alles ein großes Durcheinander...also ich hatte gehofft, dass jemand anderes das bereits getan hat, dies würde mir helfen, vielleicht jemand, der kennt die Interna des linux-kernel auf ARM-Architekturen... und leider ist hier das was das internet sagt mir, link
- Ich bin noch auf der Suche und versuchen, etwas aus dem kernel-Quellcode, ich hoffe ich finde weitere relevante Informationen vorhanden..
- Leider einige Hersteller nicht verschenken ALLE relevanten SoC Informationen als gratis-Mittagessen (Lesen Sie es so: Sie tun, aber unter NDA). Dieser SoC, wie Sie sagen, erscheint in dieser Gruppe. Aber auch diese Art von Funktionalität ist nicht sollten ausgesetzt werden, um einen Benutzer. Deshalb ist der TI behandelt es als ROM-code. Ich würde erwarten, dass die von Samsung haben es getan das gleiche. Deshalb würde ich nicht erwarten, dass man einen solchen Implementierungsdetails in Linux-kernel.
- Aber wieder, wenn Sie genug Zeit haben, könnten Sie Blättern Sie durch die Plattform-spezifische (Exynos 5) Sachen und sehen, wenn Sie finden etwas, das bezeichnend. Oder versuchen, direkt den support von Samsung. Viel Glück 🙂
- Ich hatte einen kurzen Blick auf die Exynos-code fand ich in der Android-bezogenen release. Dort finden Sie einige SMP-den zugehörigen code. Es gibt durchaus einige Dinge in Bezug auf das Booten der sekundären Kerne. Also, haben Sie einen Blick auf die folgenden Dateien: android.googlesource.com/kernel/exynos/+/... android.googlesource.com/kernel/exynos/+/...
- Könnte ich Sie bitten, aktualisieren Sie Ihre Frage etwas zu markieren, was genau sind Ihre aktuellen Fragen? Du hast eindeutig zu viel Arbeit gemacht bei der Untersuchung dieser und aktualisiert haben, die Frage mit Ihren Ergebnissen, so dass ich nicht mehr wissen, zum Beispiel, ob die GIC-Basis-Adresse ist eine Frage mehr (wenn ich mich Recht erinnere, ist es
GICbase = ((CBAR & 0x000000FF) << 32) | (CBAR & 0xFFFF0000)
, aber es ist schon mehr als ein Jahr her, seit ich gearbeitet habe, alle ARM-cores).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ok, ich bin zurück baby. Hier sind die Schlussfolgerungen:
Für meinen ODROID-XU Bord der Quellen beschreiben diesen Prozess sind UBOOT-ODROID-v2012.07 und der linux-kernel findet Ihr hier: LINUX ODROIDXU-3.4.y (es wäre besser gewesen, wenn ich sah in der kernel-version aus der Branche odroid-3.12.y da erstere nicht starten alle 8 Prozessoren, nur 4 von Ihnen, aber die letztere hat).
Ohnehin, hier ist der source code, den ich mir ausgedacht habe, poste ich die relevanten Quellcode-Dateien von der oben genannten source-code-Bäumen, die mir geholfen haben das schreiben danach:
Dies erfolgreich reaktiviert 3 von 7 der sekundären CPUs.
Und jetzt für, kurze Liste der relevanten Quell-Dateien in u-boot und der linux-kernel:
UBOOT: lowlevel_init.S - Linien 363-369, wie die Sekundär-CPUs warten, die in einem WFE für den value-at - _hotplug_addr nicht genullt und zu springen; _hotplug_addr ist eigentlich bootBase im obigen code; auch Linien 282-285 sagen uns, dass _hotplug_addr wird verlagert auf CONFIG_PHY_IRAM_NS_BASE + _hotplug_addr - nscode_base (_hotplug_addr - nscode_base ist 0x1C und CONFIG_PHY_IRAM_NS_BASE ist 0x02073000, so ist die oben hardcodings in den linux-kernel)
LINUX-KERNEL: generic - smp.c (schauen Sie auf die Funktion __cpu_bis), bestimmten Plattform (odroid-xu): platsmp.c (Funktion boot_secondary, genannt von generischen __cpu_bis; auch mit Blick auf platform_smp_prepare_cpus [auf dem Boden] => das ist die Funktion, die tatsächlich setzt den boot-Basis und power-base-Werte)
Für die Klarheit und die Zukunft, gibt es eine subtile information, die hier fehlen durch den Mangel der ordnungsgemäßen Dokumentation des Exynos-boot-Protokoll (n.b. diese Frage sollte eigentlich sein, markiert "Exynos 5" anstatt "Cortex-A15" - es ist ein SoC-spezifische Sache, und was der ARM sagt, das ist nur eine Allgemeine Empfehlung). Von cold-boot, die sekundären Kerne nicht in WFI, Sie sind immer noch ausgeschaltet.
Den einfacheren minimal-Lösung (basierend auf dem, was die Linux hotplug funktioniert), die ich arbeitete in den Prozess des Schreibens ein boot-shim um eine hypervisor läuft auf dem XU, nimmt zwei Schritte:
(0x02073000 + 0x1c)
Es sei denn, Sie planen, eine full-on-CPU-hotplug-Implementierung, die Sie überspringen können, überprüfen Sie die cluster-ID - wenn wir starten, sind wir auf die cluster 0 und nirgendwo sonst (das Kontrollkästchen für die pre-production-chips mit rückwärts cluster-Register sollte unnötig sein, auf den Odroid zu - sicherlich war das bei mir).
Aus meiner Untersuchung, heizten die A7s ist ein wenig komplizierter. Ausgehend von der Exynos big.KLEINE switcher Treiber, es scheint, dass Sie brauchen, stecken Sie eine separate set-power controller-Register zu aktivieren cluster 1 erste (und Sie müssen Durcheinander herum mit dem CCI zu, vor allem haben die MMUs und caches) - ich kam nicht weiter da zu diesem Punkt war es mehr "Spaß" als "die eigentliche Arbeit erledigen,"...
Nebenbei, Samsung mainline-patch für CPU-hotplug auf der 5410 macht der core-power-control-Zeug eher übersichtlicher als das Durcheinander in Ihren downstream-code, IMO.
QEMU verwendet PSCI
Die ARM-Power-State Coordination Interface (PSCI) ist dokumentiert unter: https://developer.arm.com/docs/den0022/latest/arm-power-state-coordination-interface-platform-design-document und steuert Dinge wie das einschalten und abschalten der Kerne.
TL;DR ist die aarch64-snippet zum aufwecken der CPU 1 auf QEMU v3.0.0 ARMv8 aarch64:
und für ARMv7:
Einer voll lauffähigen Beispiel mit einem spinlock ist verfügbar auf den ARM Abschnitt dieser Antwort: Was bedeutet multicore-Assembler Aussehen?
Den
hvc
Anweisung bekommt dann in der Hand einer EL2-handler, siehe auch: die ARM-Abschnitt: Was sind Ring 0 und Ring 3 im Kontext von Betriebssystemen?Linux-kernel
In Linux v4.19, dass-Adresse informiert den Linux-kernel durch den Geräte-Baum, QEMU zum Beispiel generiert automatisch einen Eintrag der form:
Den
hvc
Anweisung aufgerufen wird: https://github.com/torvalds/linux/blob/v4.19/drivers/firmware/psci.c#L178die bis Ende gehen zu: https://github.com/torvalds/linux/blob/v4.19/arch/arm64/kernel/smccc-call.S#L51
Gehen http://www.arm.com und download gibt es Auswertung kopieren von DS-5 developement suite. Einmal installiert, wird unter den Beispielen gibt es ein
startup_Cortex-A15MPCore directory
. Blick aufstartup.s
.startup.s
veranschaulichen?