2016-10-11 2 views
0

Ich versuche, einen Doppelpuffer mit ioctl zu implementieren (fd, FBIOPAN_DISPLAY ... mein Single-Buffer-Code funktioniert gutMMAP nicht in Versuch, Doppelpuffer framebufer

screensize = vinfo.xres * vinfo.yres * vinfo.bits_per_pixel/8; 

fbp = (char*)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); 

, wenn ich versuche, die „Länge zu erhöhen Parameter "mit screensize * 2, die mmap schlägt mit EINVAL fehl. Ich denke, dass es meine Länge Parameter nicht mag.

Die Bildschirmgröße für einen einzelnen Puffer ist 6.220.800 und für den doppelten Puffer ist 12.441600 ein eingebettetes System, aber es hat 1 Gig RAM

Der Längenparameter ist size_t, was auf diesem System nur 4 Bytes ist, was mich denken lässt, dass die maximale Größe, die ich verwenden könnte, 4 Meg wäre, aber 6 Meg funktioniert gut, also denke ich, dass mir etwas wirklich einfaches fehlt. Gibt es einen Weg zu mmap einen Puffer größer als size_t?

+0

was meinst du 'erhöhen'. sagst du Remapping? – DAG

+0

von erhöhen, ich meine, dass ich neu kompilieren und mit diesem zweiten Parameter (Länge) = Bildschirmgröße * 2. Es schlägt mit dem EINVAL errno – RTC

+0

haben Sie versucht, nur eine const var als double_screensize = screensize * 2 zu erstellen und dann an mmap übergeben? – DAG

Antwort

1

The man page sagt, dass die Länge (der zweite Parameter) vom Typ size_t ist, also glaube ich nicht, dass Sie sicher sind, einen größeren Typ zu bestehen.

Ich würde vorschlagen, dass Sie nur den ersten Teil zuordnen und dann den zweiten Teil wie abgebildet neu zuordnen in this SO Q&A.

In Bezug auf die EINVAL: finden Sie in der Manpage angegeben:

EINVAL Wir mögen es nicht Adr, Länge oder Offset (zB sind sie zu groß ist, oder nicht auf einer Seite ausgerichtet Grenze).

EINVAL (seit Linux 2.6.12) Länge von 0

EINVAL Flaggen weder MAP_PRIVATE oder MAP_SHARED enthalten oder enthalten diese beiden Werte.

Sind Sie sicher, dass Sie alle Seiten zugeordnet haben?

+0

Welcher Parameter muss page-aligniert werden? Da der erste und der letzte Parameter 0 sind, dachte ich mir, aber muss ich meinen Längenwert ändern, um sauber durch eine Seitengröße teilbar zu sein? – RTC

+0

, wenn die Bildschirmgröße erfolgreich ist und daher Seiten ausgerichtet ist. Ich würde denken, dass screensize * 2 bei Bedarf auch page-aligned wäre – RTC

+0

Okay, das ist richtig. Aber was kommt mir in den Sinn: Wenn 'screensize * 2' größer ist als' size_t', kommt es zu einem arithmetischen Überlauf, der zu undefiniertem Verhalten führen kann. Aber ich denke auch nicht, dass dies das Problem ist, denn 12.441.600 ist viel kleiner als 4.294.967.295 (angenommen size_t ist nicht). –