Atomare Operationen in ARM strex und ldrex - können Sie die Arbeit auf der I/O-Register?
Glaube, ich bin ändern von ein paar bits in eine memory-mapped-I/O-register, und es ist möglich, dass ein anderer Prozess oder und ISR werden konnte, ändern die anderen bits im gleichen register.
Kann ldrex und strex verwendet werden, um einen Schutz gegen diese? Ich meine, Sie können im Prinzip kann man da ldrex, und dann ändern Sie den bit(s), und strex es zurück, und wenn Sie das strex scheitert es bedeutet eine weitere operation haben sich die reg, und Sie müssen erneut starten. Aber können Sie das strex/ldrex-Mechanismus verwendet werden, auf ein " non-cacheable area?
Ich habe versucht, diese auf den raspberry pi, mit I/O-register zugeordnet, in userspace, und die ldrex-Betrieb gibt mir ein bus-Fehler. Wenn ich die ldrex/strex zu einem einfachen ldr/str funktioniert es einwandfrei (ist aber nicht atomar nicht mehr...) Auch, die ldrex/strex-Routinen funktionieren auf normalen RAM. Zeiger 32-bit-ausgerichtet.
Ist dies also eine Einschränkung des strex/ldrex-Mechanismus? oder ein problem mit der BCM2708-Implementierung, oder die Art und Weise, die der kernel hat es eingerichtet? (oder somethinge anderes - vielleicht habe ich es falsch zugeordnet)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank für die Erwähnung von mir...
Sie nicht mit ldrex/strex-Paare auf die Ressource selbst. Wie swp oder test-und-set oder was auch immer Ihr Befehlssatz unterstützt (für arm-es ist die swp und mehr vor kurzem strex/ldrex). Verwenden Sie diese Anweisungen auf ram, einige ram-Standort vereinbart, die von allen beteiligten Parteien. Die Prozesse, welche die Ressource verwenden Sie die ram-Position zu kämpfen, um die Kontrolle über die Ressource, wer gewinnt, bekommt dann auch tatsächlich die Adresse der Ressource. Sie würde nie swp oder ldrex/strex auf eine periphere selbst, das macht keinen Sinn. und ich konnte sehen, das Speicher-system nicht zu geben Ihnen eine exklusive okay Reaktion (EXOKAY) das ist, was Sie brauchen, um aus der ldrex/strex Endlosschleife.
Haben Sie zwei grundlegende Methoden für die gemeinsame Nutzung einer Ressource (vielleicht auch mehr, aber hier sind zwei). Ihnen ist die Nutzung dieses shared memory-Standort und jeder Nutzer der freigegebenen Ressource, kämpft um zu gewinnen die Kontrolle über den Speicherplatz. Wenn Sie gewinnen, dann reden die Ressource direkt. Wenn Sie fertig sind geben die Kontrolle über die freigegebenen Speicherort.
Die andere Methode ist, Sie haben nur ein Stück software, die erlaubt zu sprechen, um die peripheren, niemand sonst darf je Vortrag an der Peripherie. Jeder, der etwas getan zu haben auf die peripheren fragt der eine Ressource hat, um es für Sie tun. Es ist wie mit jedem teilen können, der soft-drink-Brunnen, vs Getränk Brunnen ist hinter der Theke und nur die soft-drink-Brunnen Angestellten ist es erlaubt, die soft-drink-Brunnen. Dann müssen Sie ein Schema, entweder haben die Leute in der Schlange stehen oder haben die Leute eine Zahl nehmen und berufen werden, die haben Ihr Getränk gefüllt. Zusammen mit der einzigen Ressource, die im Gespräch mit der Peripherie-Sie haben zu kommen mit einem Schema, fifo-zum Beispiel, im wesentlichen machen die Anfragen Seriell in der Natur.
Diese sind sowohl auf der Ehre system. Sie erwarten, dass sonst niemand zu sprechen, um die Peripherie, die ist eigentlich nicht zu sprechen, um die Peripherie, oder die hat man nicht das Recht zu sprechen, um die peripheren. Wenn Sie sich für hardware-Lösungen, um zu verhindern, dass die Leute von Ihr geredet, naja, die Nutzung der mmu aber jetzt müssen Sie zu verwalten, die, die gewonnen haben, die Sperre und wie bekommen Sie die mmu-freigegeben (ohne die Ehren-system) und re-blockiert in einer Weise, dass
Situationen, in denen Sie vielleicht eine interrupt-handler-und eine Vordergrund-task teilen sich eine Ressource, die Sie haben, eine oder die andere sein, die einen berühren können Sie die Ressource, und der andere bittet um Anfragen. zum Beispiel die Ressource möglicherweise werden interrupt-gesteuert (eine serielle Schnittstelle zum Beispiel) und Sie haben die interrupt-Handler sprechen, um den seriellen port-hardware direkt, wenn die Anwendung/forground Aufgabe will etwas getan zu haben, es füllt einen Antrag (legt etwas in eine fifo-Warteschlange/Puffer) der interrupt sieht dann zu sehen, ob es etwas gibt, in der Warteschlange, und wenn das so ist arbeitet er auf.
Natürlich gibt es die, die interrupts deaktivieren und wieder aktivieren, kritische Abschnitte, aber diese sind beängstigend, wenn Sie möchten, dass Ihre interrupts haben manche Vorstellung von timing/Latenz...Verstehen, was Sie tun, und Sie können verwendet werden, um dieses Problem zu lösen-app+isr zwei user-problem.
ldrex/strex auf nicht-Cache-Speicher:
Meine extest vielleicht mehr text, wenn Sie können und benutzen kann ldrex/strex, leider ist der arm docs sind nicht so gut in diesem Bereich. Sie sagen, Sie beenden, mit swp, was bedeutet, Sie verwenden sollten, strex/ldrex. Aber dann wechseln Sie zu der hardware-Handbuch, das sagt Sie nicht haben, zu unterstützen exklusiven Operationen, die auf einem Uniprozessor-system. Das sagt zwei Dinge, ldrex/strex sind gedacht für Multiprozessor-Systeme und bedeutete für den Austausch von Ressourcen zwischen Prozessoren in einem Multiprozessor-system. Auch dies bedeutet, dass ldrex/strex ist nicht unbedingt unterstützt, auf Uniprozessor-Systemen. Dann wird es noch schlimmer. ARM Logik im Allgemeinen hält, die entweder am Rand der Prozessor-core, der L1-cache enthalten ist, innerhalb dieser Grenze ist es nicht auf dem axi/amba-bus. Oder, wenn Sie Sie gekauft/Verwendung der L2-cache dann den ARM Logik hält sich an der Kante von dieser Ebene. Dann erhalten Sie in der chip vendor-spezifische Logik. Das ist die Logik, die Sie Lesen hardware-Handbuch nach, wo es sagt, dass Sie nicht BRAUCHEN, zu unterstützen, exklusive Zugriffe auf Uniprozessor-Systemen. Also das problem ist herstellerspezifisch. Und es kommt noch schlimmer, ARM L1-und L2-cache, so weit ich gefunden habe, unterstützen ldrex/strex, also, wenn man die caches dann ldrex/strex wird Arbeit an einem system, dessen Hersteller code Sie nicht unterstützt. Falls Sie nicht über den cache auf das ist, wenn Sie in Schwierigkeiten geraten, auf solchen Systemen (das ist der extest, was ich schrieb).
Den Prozessoren mit ldrex/strex sind neu genug, um eine große bank config Register zugegriffen copressor liest. begraben in es ist ein "swp-Anweisung unterstützt" bit, um zu bestimmen, ob Sie eine swap. nicht der cortex-m3 die Leute laufen in die situation, dass kein swap und keine ldrex/strex?
Den Fehler im linux-kernel (es gibt viele andere, wie auch für andere Missverständnisse von arm-hardware und-Dokumentation) ist, dass auf einem Prozessor, der unterstützt ldrex/strex die ldrex/strex Lösung gewählt wird, ohne zu bestimmen, ob es ist, Multiprozessor, so können Sie (und ich weiß von zwei Fällen) in eine unendliche ldrex/strex-Schleife. Wenn Sie änderungen an der linux-code, so dass es verwendet die swp-Lösung (gibt es code gibt, der entweder für Lösung) Sie linux funktionieren wird. warum nur zwei Leute haben gesprochen über dieses auf das internet, was ich kenne, ist, weil Sie zum abschalten des caches zu haben es (soweit ich weiß), und die wiederum aus den beiden caches und versuchen linux zu betreiben? Es nimmt wirklich eine Menge Arbeit, um erfolgreich ausschalten des caches, änderungen zu linux, sind erforderlich, um es zu arbeiten, ohne abzustürzen.
Nein, ich kann es Ihnen nicht sagen, dass die Systeme, und Nein, ich nicht jetzt, noch jemals gearbeitet haben, ARM. Dieses Zeug ist in der arm-Dokumentation, wenn Sie wissen, wo Sie suchen und wie diese zu interpretieren sind.
Wie die vorherigen Antworten Stand,
ldrex
/strex
sind nicht dazu gedacht, für den Zugriff auf die Ressource selbst, sondern vielmehr für die Umsetzung der Synchronisation-primitiven zu schützen.Allerdings habe ich das Gefühl die Notwendigkeit, zu erweitern, ein bisschen auf die architektonische bits:
ldrex
/strex
(sprich Last-exklusive/store-exclusive) unterstützt alle ARM Architektur version 6 und höher-Prozessoren, abzüglich der M0/M1-mikrocontroller (ARMv6-M).SWP
Anleitung nicht empfohlen wird dagegen einfach, weil seine Natur ist kontraproduktiv in einer multi-core - system- Sie war veraltet in ARMv6 und "optional" zu implementieren, die in bestimmten ARMv7-A-Revisionen, und die meisten ARMv7-A-Prozessoren schon verlangen, dass Sie explizit aktiviert werden im cp15SCTLR
. Linux standardmäßig nicht, und stattdessen simuliert die operation, die durch die undef-handler mithilfe von ... Last-exklusive und store-exclusive (was @dwelch bezieht sich auf oben). Also bitte nicht empfehlen SWP als eine gültige alternative, wenn Sie erwarten, dass code portabel auf ARMv7-A-Plattformen.Synchronisation mit bus-Master nicht in die inner-shareable-domain (Ihr-cache-Kohärenz-Insel, wie Sie waren) erfordert eine zusätzliche externe hardware - bezeichnet als global monitor - um zu verfolgen, welche Meister angefordert haben exklusiven Zugriff auf die Regionen.
Den "nicht erforderlich, auf Uniprozessor-Systemen" ein bisschen klingt wie die ARM-Terminologie in die Quere. Ein quad-core-Cortex-A15 ist als ein Prozessor... Also Prüfung für "Uniprozessor" in Linux würde nicht ein jota Unterschied - die Architektur-und die interconnect-Spezifikationen bleiben die gleichen, unabhängig, und die SWP ist immer noch optional und möglicherweise nicht bei allen.
Cortex-M3 unterstützt ldrex/strex, aber seine interconnect - (AHB-lite) nicht unterstützen, propagieren es, so es nicht es verwenden, um synchronisieren mit externen meistern. Es unterstützt nicht die SWP, nie eingeführt, in der Thumb-Befehlssatz, der von seinen interconnect würde auch nicht in der Lage sein, Sie zu verbreiten.
In der Regel, die
ldrex
undstrex
brauchen die Unterstützung des Speicher-Systeme. Sie verweisen möchten, um einige Antworten von dwelch sowie seine extext Anwendung. Ich würde glauben, dass Sie dies nicht tun können für memory-mapped I/O.ldrex
undstrex
bestimmt sind, mehr für Lock Frei algorithmen, in normalen Speicher.In der Regel nur ein Fahrer sollte verantwortlich einer bank I/O registriert. Software-Anforderungen um, dass Fahrer über Semaphore, etc, die umgesetzt werden können, mit
ldrex
undstrex
im normalen SDRAM. So können Sie inter-lock diese I/O registriert, aber nicht im direkten Sinne.Oft die I/O-Register sind die Unterstützung atomic Zugang durch schreiben, um klar, Multiplex access und anderen Systemen.
intmask
vielleicht zwei 32 bit Registern. Aktivierenint3
, Sie könnten die Maske1<<3
zu denintmask
oder schreiben nur3
zu einemintenable
registrieren. Sieintmask
undintenable
sind süchtig auf die gleichen bits per hardware.So können Sie emulieren eine inter-lock mit einem Treiber oder der hardware selbst unterstützen können Atomare Operationen über die normale Registrierung schreibt. Diese Regelungen dienten Systeme sowie für ruhige einige Zeit, bevor die Menschen begannen sogar zu sprechen lock frei und warten Kostenlose algorithmen.
ldrex
undstrex
und dann immer schreiben, die Lage auf der tatsächlichen hardware.ldrx
undstrx
Anweisungen sind ein high-performance-Mechanismus für die Implementierung der atomic-access-Speicher beruht auf der Zusammenarbeit der cache-controller auf jedem Kern. Memory-mapped I / O sollte nie cachable in den ersten Platz.Wenn der chip in Frage, hat eine toggle-register (welches im wesentlichen XORed mit dem Ausgabe-latch, wenn geschrieben) es ist eine Arbeit um.
solange zwei Prozesse ändern Sie nicht die gleichen pins (im Gegensatz zu "der gleiche port"), es gibt keine race-condition.
Im Fall der bcm2708 Sie konnten wählen Sie einen output-pin, dessen Nachbarn sind entweder nicht oder werden nicht verändert und schreiben GPFSELn im byte-Modus. Dies wird jedoch nur sicherzustellen, dass Sie nicht beschädigt andere. Wenn andere schreiben in den 32 bit Modus, und Sie unterbrechen Sie, Sie werden immer noch beschädigt Sie. So seine Art eine hack.
Hoffe, das hilft