2016-07-20 7 views
3

Ich möchte ein Memory-Mapped-Gerät in C zu spotten, um effektive Unit-Tests einer Geräte-Wrapping-Bibliothek (in Linux) zu tun.Mocking ein Memory-Mapped-Gerät in C in Userspace

Jetzt weiß ich, ich kann mmap ein Dateideskriptor in Benutzerbereich, die im Prinzip ein Mock des genannten Geräts darstellen könnte.

Also, AFAICT, kommt meine Frage zu diesem Thema: Ist es möglich, im Benutzerbereich einen Dateideskriptor zu erstellen, auf dem mmap handeln kann, wobei das Lesen und Schreiben durch geeignete Rückrufe behandelt wird?

Alternativ ist dies vielleicht ein gelöstes Problem, und es gibt einen bekannten Kernel-Treiber, in den man sich einklinken kann?

+0

Linux kommen, vermutlich? Bedenkt, dass Sie nicht in Apple oder Windows-Kernel-Treiber einhaken werden. – MSalters

+0

mmap eine FUSE-Dateisystem-Datei vielleicht? – Kornel

+0

@MSalter ja, Linux - Entschuldigung (Ich habe gerade in der Info in bearbeitet). –

Antwort

2

Wenn man bedenkt, dass es sich um ein Linux-System handelt, können Sie ein sehr einfaches FUSE-Dateisystem mit nur einer Datei implementieren. Der Kernel kann von dort aus damit umgehen.

Das Hauptproblem ist, dass Sie erwarten können, dass der Kernel nicht jeden Schreibvorgang löscht. Es gibt einen Anruf msync(), um alle ausstehenden Schreibvorgänge zu löschen, aber das System Under Test wird das nicht aufrufen. Ich denke jedoch, dass Sie mit dem Öffnen des Dateideskriptors mit Hilfe von O_DIRECT | O_DSYNC

+0

Ich nehme an, in diesem Fall passiert der Spott im benutzerdefinierten FUSE-Dateisystem? –

+0

Yup, es wird vom Kernel erzählt, dass eine Seite im Seitencache schmutzig ist (in geschrieben). Der FUSE-Dateisystemtreiber muss ein diff berechnen, um zu sehen, was sich geändert hat. Wenn der Schreibvorgang erfolgreich war, löscht der Kernel das Dirty-Bit im Seitencache erneut. Offensichtliche Warnung: Das erneute Lesen derselben Speicheradresse führt zu denselben Ergebnissen. Für FUSE-Dateien gibt es kein Äquivalent zu "volatile". – MSalters

+0

Ich verstehe Ihren Punkt über "volatile" nicht vollständig. Bedeutet dies, dass das Betriebssystem das, was geschrieben wurde, zwischenspeichert, obwohl der zugreifende Code den Speicher als "flüchtig" definiert hat? Macht das den Ansatz nicht nutzlos? –