2017-10-14 3 views
5

Nehmen wir an, ein 32-Bit-Wert wird in einen Speicherbereich geschrieben, der 2 Seiten umfasst. Für das Argument nehmen wir an, dass 2 Bytes in der ersten Seite und 2 in der zweiten Seite enden. Die erste Seite ist beschreibbar, aber die zweite Seite ist nicht zugeordnet. Wenn Sie den Befehl als Ganzes ausführen, wird ein Seitenfehler ausgelöst, und das ist in Ordnung.Was passiert, wenn ein nicht markierter Schreibvorgang eine Seitengrenze überschreitet und ein Fehler ausgelöst wird?

Meine Frage ist: wird der Seitenfehler Trigger vor oder nachdem die ersten 2 Bytes des Wertes in den Speicher geschrieben werden? Anders ausgedrückt, kann Code, der nach dem Fehler läuft (z. B. der Fehlerbehandler), in der Lage sein, den partiellen Schreibvorgang zu beobachten?

Nehmen wir eine X86-Umgebung an, da ich vermute, dass das Verhalten Architektur oder vielleicht sogar modellspezifisch ist.

+0

IIRC, der gesamte Schreibvorgang wird durch den Fehler abgebrochen. Intels x86-Handbücher sollten dies im Detail dokumentieren, wenn Sie dies noch einmal überprüfen möchten. Weniger sicher, aber IIRC AVX512 maskierte Speicher * können * tatsächlich einige der (nicht fehlerhaften) Elemente speichern, bevor der Fehler gemacht wird. Ich habe gerade das ISA Ref Handbuch für Streuanweisungen überprüft, und sie sagen nicht, dass: Scatter nach Fehlern in einer bestimmten Reihenfolge suchen. (Aber für ein einzelnes Element einer Streuung, wenn es fehlerhaft ist, wird es überhaupt nicht ausgeführt.) –

+1

Ich wäre überrascht, wenn es Architekturen gibt, die das partielle Speichern auf der nicht fehlerhaften Seite durchgehen lassen. Übrigens, Links zu Intels x86-Handbüchern finden Sie im [x86-Tag-Wiki] (https://stackoverflow.com/tags/x86/info). –

+0

@PeterCordes - Ich habe die AVX-512-Shops nicht überprüft, aber es funktioniert zweifellos. Selbst die AVX2-Erfassungen funktionieren auf diese Weise: Sie aktualisieren das Maskenregister nach jeder Sammeloperation (im Prinzip sowieso), so dass sie unterbrochen werden können (denke ich), und wenn eine Ausnahme ausgelöst wird, kann ein Teil der Ladung bereits abgeschlossen sein Das Maskenregister wird dies widerspiegeln (möglicherweise kann das Problem behoben und die Last neu gestartet werden). Zweifelsohne funktionieren AVX-512-Collections genauso, und es wäre komisch, wenn Scatters anders wären. – BeeOnRope

Antwort

-3

von Intel Architekturen Manual Volume 3A:

Greift zu zwischenspeicherbar Speicher, der über Cache-Zeilen und Seitengrenzen geteilt werden, sind nicht von der Intel Core 2 Duo ™, Intel® Atom zu Atom-Garantie, Intel Core Duo, Pentium M, Pentium 4, Intel Xeon, P6-Familie, Pentium und Intel486-Prozessoren.

IMO nicht atomar bedeutet, dass Ihr beschriebenes Szenario auftreten kann. Interrupt kann generiert werden, nachdem die ersten 2 Bytes geschrieben wurden.

+0

Aber die Berechtigungsprüfung für beide Teile einer Seitenaufteilung muss abgeschlossen sein, bevor eines der beiden Teile global sichtbar wird, es sei denn, ich liege falsch darin, wie es funktioniert. –

+0

Ich kann das anders nicht sehen. NOT-atomic bedeutet, dass andere Teile (andere Kerne oder Bus) Beobachter teilweise schreiben können, warum der gleiche Kern nicht Teilbeobachter bei Interrupt beobachten kann? Ich denke nicht, dass partielles Schreiben bei Auftreten eines Seitenfehlers zurückgesetzt wird. Es macht das Problem komplexer und gewinnt nichts. –

+0

würde davon abhängen, wie die Bustransfer aussieht, wenn der Kern es in zwei Übertragungen bricht oder wenn es eine einzelne nicht ausgerichtete Übertragung ist ... natürlich ist die einfachere Antwort es einfach versuchen Ja? –

Verwandte Themen