Auf RAM im unreal-Mode zugreifen
Auf RAM im unreal-Mode zugreifen
Hallo,
ich will im unreal-Mode auf Speicherbereiche zugreifen (z.B. Flat-Grafik-speicher) Das ist weiter kein Problem. Nur wie kann ich auf "normalen" RAM zugreifen? bzw. wie kann ich ermitteln, wo die Startadresse (und Größe) des nutzbaren RAMs liegt? (oberhalb 1MB)
Thx
TomCat
ich will im unreal-Mode auf Speicherbereiche zugreifen (z.B. Flat-Grafik-speicher) Das ist weiter kein Problem. Nur wie kann ich auf "normalen" RAM zugreifen? bzw. wie kann ich ermitteln, wo die Startadresse (und Größe) des nutzbaren RAMs liegt? (oberhalb 1MB)
Thx
TomCat
Re: Auf RAM im unreal-Mode zugreifen
Da ich immer wußte wie viel Speicher ich eingebaut habe, deswegen war ich bisher noch zu faul es softwareseitig zu ermitteln. Und da ich oft auch eine RAM-Disk von 64 MiB für XMS-Speicher(Himem.sys) verwende, deswegen habe ich einfach den Speicher ab dem 65. MiB von bis zu knapp 1 Gib für meine Daten benutzt.TomCat hat geschrieben:Hallo,
ich will im unreal-Mode auf Speicherbereiche zugreifen (z.B. Flat-Grafik-speicher) Das ist weiter kein Problem. Nur wie kann ich auf "normalen" RAM zugreifen? bzw. wie kann ich ermitteln, wo die Startadresse (und Größe) des nutzbaren RAMs liegt? (oberhalb 1MB)
Thx
TomCat
...
Es gibt verschiedene Methoden die Größe des nutztbaren Rams zu ermitteln. Welche Methode davon genutzt werden kann hängt davon ab wie alt der Rechner ist.
Für neuere Bios-Versionen nimmt man Funktion E820h vom int 15h:
http://www.ctyme.com/intr/rb-1741.htm
So wie ich es verstanden habe muss man diese Funktion mehrfach aufrufen und dann ggf. alle als frei markierten Bereiche zusammen rechnen, um die absolute Menge zu ermitteln.
http://www.masm32.com/board/index.php?P ... pic=1399.0
4.4. Get Memory Size:
http://tldp.org/HOWTO/Linux-i386-Boot-C ... setup.html
http://www.uruk.org/orig-grub/mem64mb.html
http://www.ecsl.cs.sunysb.edu/elibrary/linux/mm/mm.pdf
http://wiki.osdev.org/How_Do_I_Determin ... unt_Of_RAM
...
Für ältere Rechner kann man Funktion E801h vom int 15h verwenden:
http://www.ctyme.com/intr/rb-1739.htm
...
Für 80286er kann man Funktion 88h vom int 15h verwenden:
http://www.ctyme.com/intr/rb-1529.htm
Dirk
Re: Auf RAM im unreal-Mode zugreifen
a) Wenn kein XMS-Treiber vorhanden ist:TomCat hat geschrieben:Hallo,
ich will im unreal-Mode auf Speicherbereiche zugreifen (z.B. Flat-Grafik-speicher) Das ist weiter kein Problem. Nur wie kann ich auf "normalen" RAM zugreifen? bzw. wie kann ich ermitteln, wo die Startadresse (und Größe) des nutzbaren RAMs liegt? (oberhalb 1MB)
Thx
TomCat
Int. 15h, ah=88h liefert in ax die Größe des vorhandenen Speichers über der 1 MB-Grenze in kb zurück. Der Speicher beginnt per Definition an der 1 MB Grenze und geht soweit, wie eben Speicher vorhanden ist.
Problem1: max 65535kb= 64 MB möglich, was bei meinen PCs aber utopisch ist.
Problem2: mehrere Programme gleichzeitig: das aufrufende Programm muss den hohen Speicher von oben weg nutzen, den Int15h auf eine eigene Routine umleiten und dann bei aufruf von Int 15h, ah=88h in ax eben den entsprechend reduzierten "vorhandenen" Speicher angeben.
Problem3: mehrere Programme, die nicht Int15h auf eine eigene Routine umleiten: unlösbares Chaos...
b) Wenn XMS-Treiber vorhanden:
XMS Speicher normal über XMS-Treiber allokieren, dann über Funktion 0Ch den allokierten Speicher sperren lassen. In DX:BX wird dann die lineare 32bit-Adresse des allokierten XMS-Speicherbereichs zurückgeliefert (Anfangsadresse).
XMS 2.0 liefert nur max. 64 MB XMS. XMS 3.0 kann wohl alle 4 GB zur Verfügung stellen (addiere 80h zur Funktionsnummer, dann erhälst Du 32-bit-Rückgabewerte).
PS: Ich verwende nur noch die XMS 2.0-Methode. Klappt bisher mit allen, auch residenten XMS-Tools hervorragend.
Edit: @Freecrac: Danke für die weiterführenden Hinweise
Zuletzt geändert von wobo am Do 8. Dez 2011, 22:13, insgesamt 1-mal geändert.
Re: Auf RAM im unreal-Mode zugreifen
Falls ich es mal brauche komme ich auf deine Methode zurück.wobo hat geschrieben:@Freecrac: Danke für die weiterführenden Hinweise
Dirk
Re: Auf RAM im unreal-Mode zugreifen
danke, also die Größe des RAMs hab ich jetzt mit ax=0e801h und int 15h bekommen. Funktioniert auf verschiedenen Rechner sehr gut. Also das würde mir erstmal so reichen. Leider kann ich auf den Speicher nicht zugreifen, hab mir eine kleine Funktion geschrieben, die einfach Daten in den Speicher schreibt und wieder ausliest. (Kann ich gerne posten). Leider bekomme ich da Fehler. Muss man da Speicher zusätzlich noch irgendwie allokieren ? So funktioniert es jedenfalls nicht.freecrac hat geschrieben:Da ich immer wußte wie viel Speicher ich eingebaut habe, deswegen war ich bisher noch zu faul es softwareseitig zu ermitteln. Und da ich oft auch eine RAM-Disk von 64 MiB für XMS-Speicher(Himem.sys) verwende, deswegen habe ich einfach den Speicher ab dem 65. MiB von bis zu knapp 1 Gib für meine Daten benutzt.TomCat hat geschrieben:Hallo,
ich will im unreal-Mode auf Speicherbereiche zugreifen (z.B. Flat-Grafik-speicher) Das ist weiter kein Problem. Nur wie kann ich auf "normalen" RAM zugreifen? bzw. wie kann ich ermitteln, wo die Startadresse (und Größe) des nutzbaren RAMs liegt? (oberhalb 1MB)
Thx
TomCat
...
Dirk
TomCat
Re: Auf RAM im unreal-Mode zugreifen
@freecrac: Bedeutet das, daß Deine Programme nur laufen, wenn mehr Speicher als 64 MB vorhanden sind?freecrac hat geschrieben:Da ich immer wußte wie viel Speicher ich eingebaut habe, deswegen war ich bisher noch zu faul es softwareseitig zu ermitteln. Und da ich oft auch eine RAM-Disk von 64 MiB für XMS-Speicher(Himem.sys) verwende, deswegen habe ich einfach den Speicher ab dem 65. MiB von bis zu knapp 1 Gib für meine Daten benutzt.
Re: Auf RAM im unreal-Mode zugreifen
Abgesehen davon, dass ich die Funktion ax=0E801h nicht kenne (meine PCs sind zu alt), ist eigentlich so, dass Du den Speicher über das BIOS weder allokieren mußt noch kannst. Die Speicherverwaltung ist aus Sicht des BIOS wohl Sache des Betriebssystems bzw. eines entsprechenden Treibers (XMS).TomCat hat geschrieben:
...
danke, also die Größe des RAMs hab ich jetzt mit ax=0e801h und int 15h bekommen. Funktioniert auf verschiedenen Rechner sehr gut. Also das würde mir erstmal so reichen. Leider kann ich auf den Speicher nicht zugreifen, hab mir eine kleine Funktion geschrieben, die einfach Daten in den Speicher schreibt und wieder ausliest. (Kann ich gerne posten). Leider bekomme ich da Fehler. Muss man da Speicher zusätzlich noch irgendwie allokieren ? So funktioniert es jedenfalls nicht.
TomCat
Gate A20 hast Du angeschaltet?
Ansonsten, poste doch mal Deine Routine...
Re: Auf RAM im unreal-Mode zugreifen
Ja. Aber ich glaube, seine Programme brauchen so oder so immer knapp 1 GB Minimum (hat er mal geschrieben). Da ist es dann wurscht, wenn er die ersten 64 MB verschwendet.DOSferatu hat geschrieben:@freecrac: Bedeutet das, daß Deine Programme nur laufen, wenn mehr Speicher als 64 MB vorhanden sind?freecrac hat geschrieben:Da ich immer wußte wie viel Speicher ich eingebaut habe, deswegen war ich bisher noch zu faul es softwareseitig zu ermitteln. Und da ich oft auch eine RAM-Disk von 64 MiB für XMS-Speicher(Himem.sys) verwende, deswegen habe ich einfach den Speicher ab dem 65. MiB von bis zu knapp 1 Gib für meine Daten benutzt.
Re: Auf RAM im unreal-Mode zugreifen
Boah, was schreibt der denn fürn Zeug?! Ich wüßte gar nicht, womit ich EIN GIGABYTE vollkriegen soll...
Re: Auf RAM im unreal-Mode zugreifen
Frag mich erst. Ich krieg nicht mal die 6 MB meines PCs voll. Hatte mir dafür extra Mal einen Fli-PLlayer geschrieben, wo ich die Flis in das XMs/Unreal geladen hatte, um endlich mal das Ram zu nutzen, das ich habe. Und dabei lief noch die TP 7.0 - IDE, der ich auch immer komfortable 1,5 MB XMS gönne...DOSferatu hat geschrieben:Boah, was schreibt der denn fürn Zeug?! Ich wüßte gar nicht, womit ich EIN GIGABYTE vollkriegen soll...
Re: Auf RAM im unreal-Mode zugreifen
hier die Routine(vereinfacht)wobo hat geschrieben:Abgesehen davon, dass ich die Funktion ax=0E801h nicht kenne (meine PCs sind zu alt), ist eigentlich so, dass Du den Speicher über das BIOS weder allokieren mußt noch kannst. Die Speicherverwaltung ist aus Sicht des BIOS wohl Sache des Betriebssystems bzw. eines entsprechenden Treibers (XMS).TomCat hat geschrieben:
...
danke, also die Größe des RAMs hab ich jetzt mit ax=0e801h und int 15h bekommen. Funktioniert auf verschiedenen Rechner sehr gut. Also das würde mir erstmal so reichen. Leider kann ich auf den Speicher nicht zugreifen, hab mir eine kleine Funktion geschrieben, die einfach Daten in den Speicher schreibt und wieder ausliest. (Kann ich gerne posten). Leider bekomme ich da Fehler. Muss man da Speicher zusätzlich noch irgendwie allokieren ? So funktioniert es jedenfalls nicht.
TomCat
Gate A20 hast Du angeschaltet?
Ansonsten, poste doch mal Deine Routine...
mov ax,data1
mov ds,ax
assume ds:data1
mov eax,0
mov fs,eax
mov Counter,0
mov edi,200000000 ;200 Millionen = Startadresse
mov esi,edi ;sichern der Startadresse
mov eax,0
mov ecx,10000000 ;10 millionen dwords werden geschrieben
;fuellen des speichers mit 32-bit werten.
loop1: mov fs:[edi],eax
add edi,4
inc eax
dec ecx
jnz loop1
;auslesen des speichers
mov edi,esi ;startadresse restaurieren
mov eax,0
mov ecx,10000000 ;10 mio
loop2: mov ebx,fs:[edi]
cmp ebx,eax
jne label_fehler
inc counter
add edi,4
inc eax
dec ecx
jnz loop2
label_fehler:
-----------------------------------------------------------------------
erklaerung: der counter zeigt mir an, wie lange die schleife laeuft, bis ein fehler aufgetreten ist. in abhaengigkeit des speicherbereichs oftmals 0 manchmel sogar ca. 100.000 durchlaeufe
und nein, ich verwende Ga20 nicht.
Mein RAM ist 1GB groß.
Re: Auf RAM im unreal-Mode zugreifen
Also in der ASM-Routine ist mir kein Fehler aufgefallen (Ich bin aber auch kein ASM-Guru).TomCat hat geschrieben:
hier die Routine(vereinfacht)-----------------------------------------------------------------------Code: Alles auswählen
mov ax,data1 mov ds,ax assume ds:data1 mov eax,0 mov fs,eax mov Counter,0 mov edi,200000000 ;200 Millionen = Startadresse mov esi,edi ;sichern der Startadresse mov eax,0 mov ecx,10000000 ;10 millionen dwords werden geschrieben ;fuellen des speichers mit 32-bit werten. loop1: mov fs:[edi],eax add edi,4 inc eax dec ecx jnz loop1 ;auslesen des speichers mov edi,esi ;startadresse restaurieren mov eax,0 mov ecx,10000000 ;10 mio loop2: mov ebx,fs:[edi] cmp ebx,eax jne label_fehler inc counter add edi,4 inc eax dec ecx jnz loop2 label_fehler:
erklaerung: der counter zeigt mir an, wie lange die schleife laeuft, bis ein fehler aufgetreten ist. in abhaengigkeit des speicherbereichs oftmals 0 manchmel sogar ca. 100.000 durchlaeufe
und nein, ich verwende Ga20 nicht.
Mein RAM ist 1GB groß.
Aber A20 musst Du schon anschalten, weil ansonsten immer die 21. Adressleiste gelöscht wird. Speicher über 1 MB kann dann natürlich nicht korrekt angesprochen werden.
Das A20 kann man m.W. über den Tastaturcontroller (kompliziert) oder einfach über den XMS-Treiber (Funktion 03h) freischalten.
Näheres hier
http://de.wikipedia.org/wiki/A20-Gate
Wenn es manchmal trotzdem klappt, oder z.B. der Zugriff auf die Grafikkarte klappt, kann ich mir das nur so erklären, dass das A20 Gate wirklich nur die 21.Adressleitung (=Leitung Nr. 20, die erste beginnt bei Null) sperrt. Die Adressleitungen 21-31 müssten davon unberührt bleiben. Bei manchen Adressen ist wahrscheinlich die 21. Adressleitung so oder so Null, wenn z.B. der Linear Frame Buffer der VGA auf genau 3 GB liegt und Du innerhalb des hierauf folgenden MB bleibst.
Die Formatierung für Sourcecode bleibt übrigens nur erhalten, wenn Du die
[_code_] [_/code_] -Merker (ohne die Unterstriche) verwendest.
Edit: Falsche Formulierung gändert. Danke DosFeratu!
Zuletzt geändert von wobo am Do 8. Dez 2011, 22:16, insgesamt 1-mal geändert.
Re: Auf RAM im unreal-Mode zugreifen
Also wenn die 21. Adreßleitung =0 ist und die darüber nicht, würde man aber trotzdem jedes zweite MB irgendwie doppelt haben oder so... weil ja dann in einer Adresse immer das eine Bit 0 wäre. Ich glaube nicht, daß das so funktionieren würde.
Einfache Erklärung: Man stelle sich vor, das Adreßbit 0 wäre immer 0. Dann würde man keine ungeraden Adressen mehr ansprechen können....
Einfache Erklärung: Man stelle sich vor, das Adreßbit 0 wäre immer 0. Dann würde man keine ungeraden Adressen mehr ansprechen können....
Re: Auf RAM im unreal-Mode zugreifen
Das ist richtig. Ich meinte halt den Fall, dass er zufällig genau innerhalb eines MB bleibt, bei welchem die 21. Adressleitung so oder so Null ist, z.B. von 2 MB - 3 MB.DOSferatu hat geschrieben:Also wenn die 21. Adreßleitung =0 ist und die darüber nicht, würde man aber trotzdem jedes zweite MB irgendwie doppelt haben oder so... weil ja dann in einer Adresse immer das eine Bit 0 wäre. Ich glaube nicht, daß das so funktionieren würde.
Einfache Erklärung: Man stelle sich vor, das Adreßbit 0 wäre immer 0. Dann würde man keine ungeraden Adressen mehr ansprechen können....
Aber das Gate A20 muss auf jeden Fall freigeschaltet werden, wenn man Unreal/4G verwenden will.
Edit: Meine total fehlerhafte Formulierung im vorigen Posting habe ich jetzt so umformuliert, wie ich es eigentlich gemeint hatte. Danke!
Re: Auf RAM im unreal-Mode zugreifen
Ja poste mal diese Routine, dann schaue ich mal wo der Fehler ist.TomCat hat geschrieben:danke, also die Größe des RAMs hab ich jetzt mit ax=0e801h und int 15h bekommen. Funktioniert auf verschiedenen Rechner sehr gut. Also das würde mir erstmal so reichen. Leider kann ich auf den Speicher nicht zugreifen, hab mir eine kleine Funktion geschrieben, die einfach Daten in den Speicher schreibt und wieder ausliest. (Kann ich gerne posten). Leider bekomme ich da Fehler. Muss man da Speicher zusätzlich noch irgendwie allokieren ? So funktioniert es jedenfalls nicht.freecrac hat geschrieben:Da ich immer wußte wie viel Speicher ich eingebaut habe, deswegen war ich bisher noch zu faul es softwareseitig zu ermitteln. Und da ich oft auch eine RAM-Disk von 64 MiB für XMS-Speicher(Himem.sys) verwende, deswegen habe ich einfach den Speicher ab dem 65. MiB von bis zu knapp 1 Gib für meine Daten benutzt.TomCat hat geschrieben:Hallo,
ich will im unreal-Mode auf Speicherbereiche zugreifen (z.B. Flat-Grafik-speicher) Das ist weiter kein Problem. Nur wie kann ich auf "normalen" RAM zugreifen? bzw. wie kann ich ermitteln, wo die Startadresse (und Größe) des nutzbaren RAMs liegt? (oberhalb 1MB)
Thx
TomCat
...
Dirk
TomCat
Edit: Oh ist ja schon da.
Zusätzlich braucht man diesen Speicher eigentlich nicht allokieren.
Dirk
Zuletzt geändert von freecrac am Sa 10. Dez 2011, 15:07, insgesamt 1-mal geändert.