Auf RAM im unreal-Mode zugreifen

Diskussion zum Thema Programmierung unter DOS (Intel x86)
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Auf RAM im unreal-Mode zugreifen

Beitrag von TomCat »

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
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von freecrac »

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
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.

...

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
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von wobo »

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
a) Wenn kein XMS-Treiber vorhanden ist:

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.
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von freecrac »

wobo hat geschrieben:@Freecrac: Danke für die weiterführenden Hinweise :-)
Falls ich es mal brauche komme ich auf deine Methode zurück.

Dirk
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von TomCat »

freecrac hat geschrieben:
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
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.

...
Dirk
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
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von DOSferatu »

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.
@freecrac: Bedeutet das, daß Deine Programme nur laufen, wenn mehr Speicher als 64 MB vorhanden sind?
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von wobo »

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
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).

Gate A20 hast Du angeschaltet?

Ansonsten, poste doch mal Deine Routine...
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von wobo »

DOSferatu hat geschrieben:
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.
@freecrac: Bedeutet das, daß Deine Programme nur laufen, wenn mehr Speicher als 64 MB vorhanden sind?
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
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von DOSferatu »

Boah, was schreibt der denn fürn Zeug?! Ich wüßte gar nicht, womit ich EIN GIGABYTE vollkriegen soll...
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von wobo »

DOSferatu hat geschrieben:Boah, was schreibt der denn fürn Zeug?! Ich wüßte gar nicht, womit ich EIN GIGABYTE vollkriegen soll...
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...
TomCat
MemMaker-Benutzer
Beiträge: 87
Registriert: Do 1. Dez 2011, 17:16

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von TomCat »

wobo hat geschrieben:
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
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).

Gate A20 hast Du angeschaltet?

Ansonsten, poste doch mal Deine Routine...
hier die Routine(vereinfacht)

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ß.
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von wobo »

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ß.
Also in der ASM-Routine ist mir kein Fehler aufgefallen (Ich bin aber auch kein ASM-Guru).

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.
DOSferatu
DOS-Übermensch
Beiträge: 1220
Registriert: Di 25. Sep 2007, 12:05
Kontaktdaten:

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von DOSferatu »

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....
wobo
DOS-Guru
Beiträge: 614
Registriert: So 17. Okt 2010, 14:40

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von wobo »

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....
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.

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!
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Auf RAM im unreal-Mode zugreifen

Beitrag von freecrac »

TomCat hat geschrieben:
freecrac hat geschrieben:
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
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.

...
Dirk
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
Ja poste mal diese Routine, dann schaue ich mal wo der Fehler ist.

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.
Antworten