ARM: Ist das schreiben/Lesen von int atomic?
Auf der ARM-Architektur, leider weiß ich nicht mehr genau, was der chip ist, ist ein 32-bit int read/write atomic?
Gibt es irgendeine Art von Garantie dafür, liest/schreibt Grundtypen?
- Wenn das
int
ist entsprechend ausgerichtet (auf 4 bytes), ich denke, dass, wie auf den meisten 32-bit-Prozessoren, das schreiben ist irgendwie atomic. Aber die wirkliche Frage ist die Speicher-Modell (vor allem im multi-core-Situationen : cache-Kohärenz, etc.). - Auch wenn es keine cache-Kohärenz -, den lese - /Schreibzugriff zum Hauptspeicher wäre noch atomic (aber zeitversetzt)
- ja Speicher Modell ist ein guter Punkt, aber ich habe nur auf ARM-cpu mit einem Kern.
- Ja, es ist atomic (außer vielleicht in einem struct verpackt). Siehe meine ausführliche Antwort, auch für alle anderen Datentypen, hier: stackoverflow.com/a/52785864/4561887.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte es atomar werden, AUßER wenn das int gespeichert ist, auf eine nicht ausgerichtete Adresse.
int
können, kommen in die Existenz in C alle erfordern, dass es auf eines ausgerichtet-Adresse. Der einzige Weg wäre es nicht, wenn Sie illegal versuchen, um Zugriff auf Speicher, der nicht einint
als ob es waren.Dokumentiert ist diese entweder in der TRM für den Kern oder in der AMBA - /AXI-spec. Sie müssen sich den Kern verwendet, die aus dort, wenn Sie es herausfinden, was Geschmack der AMBA/AXI-bus und in das spec-Sie beschreibt die Atomare und nicht-Atomare Natur der einzelnen Vorgangsarten.
Beispielsweise die swp und ldrex/strex sind atomar. Einen strd-und stm sollte auch atomic. Aber auf der ARM11 Mpcore, dass ich am meisten vertraut es bricht die schreibt, in einer einzigen 64-bit-bus-Zyklen, eine stm mit 8 Register, die ich denke, es wird 4 separaten Länge von 1-bus-Zyklen, wo ein ldm 8 Register, die ich denke, ist eine einzelne Transaktion mit einer Länge von vier.
Dies ist ein guter Zeitpunkt, um beachten Sie, dass ldrex und strex sind oft nicht richtig von den Programmierern. Linux hat es falsch zum Beispiel. Sie sind für die Blockierung, wenn mit einem Mehrkern-Prozessor auf einem shared-memory-system, NICHT für das sperren von software-threads auf einem einzelnen Prozessor. Verwenden SWP für, die. Hat man Glück, wenn Sie den L1-cache auf als ldrex/strex passiert, zu arbeiten (in diesem einen Prozessor).
Beachten Sie ARM ist immer erlaubt unaligned-Zugriffe, manchmal standardmäßig (ARM7TDMI) nach, dass die Vorgabe war, zu werfen, ein data abort, Sie können aber die Einstellung so ändern, dass nicht. Unaligned, die auf der ARM nicht tut, was x86-Programmierer wollen zum Beispiel. wenn du das liest 32 bits bei Adresse 0x02 Sie nicht unbedingt die Auflistung der bytes 0x02, 0x03, 0x04, 0x05, Sie kann/will bekommen, 0x02, 0x03, 0x00, 0x01, mit einem 32-bit-AMBA - /AXI-bus. KÖNNTE man das gewünschte Ergebnis auf einem 64-bit-AMBA - /AXI-bus, aber vielleicht auch nicht, auf jeden Fall auf beiden 32 und 64 bit wenn du das liest 32 bits an Adresse 0x0E erhalten Sie 0x0E 0x0F und entweder 0x08 0x09 oder 0x0c 0x0D. Überhaupt nicht das, was der Programmierer erwartet (in der Regel, einige, die wissen, wie es funktioniert, verwenden Sie es als ein schönes byte-swapper), so ist es oft Links wirft eine data abort und der Programmierer die Festsetzung Ihrer code.
C-Compiler sehr oft erstellen unaligned-Zugriffe, die ist, warum es schwer ist für x86-Programmierer Anschluss Ihren code oder verschieben aus, dass die Plattform auf ein anderes system. Sie zahlen eine schwere Strafe auf x86 (schrecklich Leistung), aber auch nicht so schwer, eine Strafe als andere Prozessoren (Speicher abgebrochen). SO ist vollgepackt mit Fragen zum Thema, wie mache ich meinen code laufen auf der xyz-Prozessor.
Ich komme aus der soap-box. ARM hat eine ausgezeichnete Arbeit der Erfassung aller von diesem Zeug (im Vergleich zu anderen chip-Herstellern). Die TRM (technical reference manual, jeder Kern hat eine) beschreibt die AMBA/AXI-bus oder bus-Entscheidungen und werden in die Vorgangsarten. Dann die AMBA/AXI-Dokumenten weiter gehen, um zu erklären, was Los ist. Das Loch könnte es sein eine Karte zwischen den Anweisungen und der Art des Geschäftes. Wenn Sie eine ldm-6 Worte an die Adresse 0x4 auf einem 64-bit-AXI-bus, erhalten Sie einen 32-bit-Lesen an der Adresse 4, Länge 1 haben. Sie erhalten dann eine Länge von 2 64 bit Lesen (vier bytes) an Adresse 0x8 (für Wörter, 0x8, 0xC, 0x10-und 0x14, dann eine separate 32-bit-Lesen an der Adresse 0x18. Nur weil es wird eine 3-axi-Transaktionen bedeutet nicht, es ist nicht-atomar; es lässt die Möglichkeit für nicht-Atomare, sicher, aber würden Sie haben zu prüfen, die ARM-docs.