Warum ist das Cache-Größen-Identifizierungsregister auf ARM-CPUs nur in privilegierten Modi zugänglich?

Gibt es dahinter eine logische Entscheidungsfindung, die nach meinem Verständnis nur die gleichen Informationen wie die CPUID-Anweisung von x86 enthält, also warum wird sie nur EL1 zugänglich gemacht? Ist das in irgendeiner Weise sicherer oder ist es vielleicht nur "über Sicherheit"?

Nach einem schnellen Überfliegen sind die meisten verwandten Register, einschließlich des Äquivalents von CPUID, auch "nur im privilegierten Modus". Ich vermute, dies soll vermeiden, darüber nachdenken zu müssen, ob sie einen Exploit aktivieren könnten, z. B. Cache-Eviction-Timing-Angriffe auf Prozesse anderer Benutzer.
@ pjc50 Das war mein erster Gedanke, aber er scheint mir etwas faul und ich frage mich, ob ein ausreichend entschlossener Angreifer nach einer Latenzanalyse noch Cache-Timing-Angriffe durchführen könnte. Und es scheint sowieso der Fall zu sein: blackhat.com/docs/eu-16/materials/…
Vielleicht hängt es mit TrustZone zusammen. Ich stelle von ieeexplore.ieee.org/document/7546496 fest, dass Cache-Zeilen als "nur sichere Welt" gekennzeichnet und Cache-Zeilen gesperrt werden können. Das einfache Nachschlagen der Cache-Größe garantiert also nicht, dass N Zeilen wirklich verfügbar sind Benutzerprogramme.

Antworten (2)

Es soll die Abstraktion von Aufgaben auf Benutzerberechtigungsebene von der Hardware unterstützen, auf der sie ausgeführt werden.

Ein Betriebssystem kann auf einer höheren Berechtigungsebene ausgeführt werden und auf die Cache-Größendaten zusammen mit anderen Daten über die Hardware zugreifen, auf der es ausgeführt wird. Es liegt in der Verantwortung eines solchen Betriebssystems, sich mit der Hardware zu befassen und sie von den Programmen auf Benutzerebene zu abstrahieren.

Tasks/Prozesse auf Benutzerebene sollten möglichst nicht wissen, auf welcher CPU sie laufen. Dies verhindert das Schreiben von Software im Benutzermodus, die auf die bestimmte Hardware abgestimmt ist, auf der sie sich befindet. Solche Software läuft dann möglicherweise nicht korrekt auf einer anderen CPU, was die Wiederverwendung und Portabilität verringert. Details wie die Cache-Größe liegen bei vielen Programmen unter dem Interesse.

Das Betriebssystem erlaubt normalerweise Benutzertasks/-prozessen, Hardwaredaten zu erhalten, die die Designer des Betriebssystems/Systems für relevant oder nützlich halten, über die API (Funktionsaufrufe an das Betriebssystem).

Dadurch kann das Benutzerprogramm darauf zugreifen und seinen Wert einstellen. Da viele ARM-Systeme Benutzercode direkt ausführen, ist dies lediglich ein Ärgernis. Von einem bestimmten Stil abzuraten, Anwendungscode auf dieser Ebene zu schreiben, ist kaum ein guter Grund, Informationen zu verbergen.
@PlasmaHH, was bedeutet, dass das Betriebssystem diese Daten verfügbar machen kann, wenn die Designer des Betriebssystems dies für geeignet halten. Oder nicht. Warum die Ablehnung? Dies sind Standarddesignprinzipien für ein geschütztes Betriebssystem, der PC, auf dem Sie tippen, wendet diese Prinzipien an. Es hört sich so an, als würden Sie Ihre Vorliebe für CPU/OS-Design erklären, nicht was da draußen ist.
Ablehnung für die Erklärung der vermuteten Begründung des Architekten?
@TonyM Es tut mir leid, dass ich es nicht sehe. Haben Sie eine Quelle, um zu belegen, dass dies der treibende Faktor für die Wahl ist? Die Entscheidung, ob ein Benutzer auf den aktuellen Prozessor abstimmen kann, liegt nicht beim CPU-Designer, dies sollte auf jeden Fall an den Benutzer delegiert werden.
Es ist nicht nur das Betriebssystem, es muss auch ein Hypervisor in Betracht gezogen werden.

Dies ist ein wenig Spekulation, aber: ARM-Architekturen wurden immer im Hinblick auf Multiprocessing entwickelt; Selbst der niedrigste Cortex-M0 verfügt beispielsweise über eine Menge Hardware-Automatisierung, wenn es um die Kontextumschaltung geht. Jetzt kommt Cortex-M0 normalerweise ohne Cache.

Es ist durchaus denkbar, dass die Designer beim Einfügen von Caches bereits an die Möglichkeit gedacht haben, dass eine Implementierung eines Siliziumherstellers Teile des Caches vor der vom Benutzer ausgeführten Software verbergen möchte, sodass es ein logisches Problem gibt, der Userland-Software mitzuteilen, wie groß der Cache ist, da diese Größe möglicherweise nicht auf sie zutrifft. Besonders auf Cortex-R wäre das sehr sinnvoll – Sie möchten vielleicht einen Teil der Daten auf „Betriebssystemebene“ in einem Cache mit deterministischer Latenz aufbewahren, also verstecken Sie diesen Cache vor dem anderen Kontext. (Beachten Sie, dass dies für ARM besonders einfach ist – es gibt verschiedene Stack-Modi, die von einem einzelnen Registerbit gesteuert werden, und Ihr Cache-Controller könnte sich einfach darauf stützen, um zu entscheiden, ob es in Ordnung ist, ein Stück Cache zu zerstören oder nicht.)