|
Hauptseite - Welches System? - Hardware - Software - Emulatoren - |
Internet MausNet Programmieren Verweise Über |
Alle tms Produkte arbeiten mit einer virtuellen Speicherverwaltung. Dies bedeutet, es muß auf nicht im RAM befindliche Speicherbereiche zugegriffen werden. Die in tms- Produkte implementierte virtuelle Speicherverwaltung wurde für die Belange von Bildern optimiert.
Allg. vorgehensweise: Der Treiber übergibt in scancom.schreiben eine virtuelle Handle. Mit dieser Handle kann nun auf die virtuellen Daten zugegriffen werden. Die Daten werden automatisch von der Platte, wenn nötig, nachgeladen und gespeichert.
Eine mögliche Anwendung wäre:
UCHAR *real; long max_vor, max_zurueck;
scancom->vspeicher zeigt auf den freien virtuellen Speicher. Dieser ist wie ein normaler Speicher zu betrachten, also z.B. freier Speicher von Adrr 16MB bis Adrr 50MB mit scancom->vspeicher = Adrr 30MB. Da diese Adresse nicht wirklich existiert, muss der Pointer auf einen realen Speicher abgebildet werden, und die Daten auf der Platte geladen werden. das erledigt die Funktion Dchange_pointer.
real = (UCHAR*)Dchange_pointer( scancom->vspeicher, scancom->schreiben, VOR, &max_vor, &max_zurueck );
real zeigt jetzt also auf einen RAM- Bereich.
scancom->schreiben ist die vom Programm übergebene Speicherhandle
VOR sagt der Speicherverwaltung, daß wir uns vor allem nach vorne im Speicher bewegen werden. Somit können die Plattenzugriffe optimiert werden.
max_vor liefert zurück, wieviele Bytes ab real im Speicher nach vorne gelaufen werden darf.
max_zurück liefert zurück, wieviele Bytes ab real im Speicher nach hinten gelaufen werden darf.
Werden diese Grenzen erreicht, so muß Dchange_pointer erneut aufgerufen werden. Die Mindestlänge für max_vor und max_zurück:
VOR | ZURÜCK | MITTE | |
max_vor: | 32k | 0k | 16k |
max_zurück: | 0k | 32k | 16k |
Der Ram Speicher ist in 6 Blöcke unterteilt, von denen jeder einen unterschiedlichen oder aber auch einen Überlappenden Teil des virtuellen Speichers abbilden kann. Um beim Überlappen von Blöcken zu gewährleisten, das nach einer Speicheränderung alle Blöcke den aktuellen Speicherinhalt wiedergeben, wird die Funktion Dupdate(scancom->schreiben) aufgerufen. Diese aktualisiert die anderen Blöcke. Dupdate ist aber nur nötig bevor auf einen anderen Block zugegriffen wird. Für einen Scannertreiber der nur den Block scancom->schreiben benutzt reicht es deshalb am Schluss des Scannens Dupdate(scancom->schreiben) aufzurufen.
Beispiel löschen von 10Mb ab Adresse 32MB
v_pointer=32Mb size=10Mb while(size>0) { real=Dchange_pointer(v_pointer, scancom->schreiben, VOR, &max_vor, &max_zurueck); if(max_vor<=size) { memset(real,0,max_vor); size-=max_vor; v_pointer+=max_vor; } else { memset(real,0,size); size=0; v_pointer+=size; } } Dupdate(scancom->schreiben); !!!!!!!!!!!!!
![]() |
English version not yet available. |