Wie weit kann man den Malloc-Speicher treiben 1x 5x beim 8086?

OP #6145157
Hallo, guten Tag.

Ich habe jetzt 2 x Malloc mit 64000 Byte ,wenn ich es richtig gemacht 
habe.

Habe tcc -ml .... compiliert.

Es kommt keine Fehlermeldung und die Werte werden ausgegeben.
Ich kann trotzdem nicht beurteilen ob nicht Fehler verschlammt wurden.

Danke.
Gruss

---------------------
#include <stdio.h>
#include <stdlib.h>

int main(void) {
unsigned   char *p = malloc(64000 * sizeof(unsigned char));
unsigned   char *z = malloc(64000 * sizeof(unsigned char));

   if(p != NULL) {
      *p=99;             /* alternativ auch p[0] = 99  */
      *(p+63999) = 255;  /* alternativ auch p[63999] = 255 */
      *z=100;            /* alternativ auch p[0] = 100  */
      *(z+63999) = 101;  /* alternativ auch p[63999] = 101 */
      printf("Allokation erfolgreich ... \n");
   }
   else {
      printf("Kein virtueller RAM mehr verfuegbar ...\n");
      return EXIT_FAILURE;
   }
   printf("%d %d\n", p[0], p[63999]);
   /* Sie können die Werte auch so ausgeben lassen. */
   printf("%d %d\n", *p, *(p+63999));

   printf("%d %d\n", z[0], z[63999]);
   /* Sie können die Werte auch so ausgeben lassen. */
   printf("%d %d\n", *z, *(z+63999));
   return EXIT_SUCCESS;
}
--------------
Angehängte Dateien:
Gast
Im large Speichermodell bis der bis 4GB fassende 32 bit Speicher voll 
ist. Notfalls wird vom Betriebssystem geswappt.
Du kannst halt keinen Block mit 66000 bytes malloc'en.
OP
Hallo, gute Tag.

Ich wollte jetzt den VGA-Inhalt (VGA 320x200 256 Color) nach Malloc 
copieren.

Und wenn sich das Sprite bewegt wollte ich das Loch im VGA mit den 
Inhalt von  Malloc wieder flicken.

Ich wollte es evtl in ASM machen .
Wo finde ich das bestimmte Segment von Malloc dafür.
Fängt dort der Speicher auch bitte bei Null an ?  zb 0xd000:0

Oder ein von beiden welches ist bitte günstiger und schneller :
*(p+63999) = 255; oder
p[63999] = 255;

Danke.
Gruss
Gast
MaWin schrieb:
> Im large Speichermodell bis der bis 4GB fassende 32 bit Speicher
> voll
> ist. Notfalls wird vom Betriebssystem geswappt.
> Du kannst halt keinen Block mit 66000 bytes malloc'en.

Das läuft unter Dos, da wird nichts geswappt
Gast
Peter B. schrieb:
> Ich wollte es evtl in ASM machen .
> Wo finde ich das bestimmte Segment von Malloc dafür.
> Fängt dort der Speicher auch bitte bei Null an ?  zb 0xd000:0

Das Ergebnis von malloc ist in deinem Fall das Segment

> Oder ein von beiden welches ist bitte günstiger und schneller :
> *(p+63999) = 255; oder
> p[63999] = 255;
>
> Danke.
> Gruss

Die Array Zuweisungen erzeugt identischen Code
MaWin schrieb:
> Im large Speichermodell bis der bis 4GB fassende 32 bit Speicher voll
> ist. Notfalls wird vom Betriebssystem geswappt.

DOS kennt kein Swapping. Und es kennt auch keine 4 GB RAM, außer 
vielleicht über extended oder expanded memory. Da kommt man aber mit 
einem simplen malloc nicht dran. Auch im Large-Modell kann ein Zeiger 
nicht mehr als 1 MB (plus 65520 Bytes, die HMA) adressieren.
Peter B. schrieb:
> Hallo, gute Tag.

AH, immer noch da.

> Wo finde ich das bestimmte Segment von Malloc dafür.

So, Grundlagen:

Physikalische Adresse: Segment*16+Offset.
Ein an einer 16 Byte Grenze liegender Block von 16 Bytes nennt man 
Paragraph.

Bei large und huge arbeitest Du mit FAR Pointern, d.h. Pointer mit 32 
Bit Größe und Segment:Offset.
Bei small arbeitest Du mit NEAR Pointern.

FAR und NEAR sollten als Macros irgendwo in einem Headerfile definiert 
sein.

mit p=MK_FP(seg,ofs) bastelst Du Dir einen FAR Pointer aus Segment und 
Offset.
seg=SEG(p); ofs=OFS(p); geben Dir Segment und Offset eines FAR Pointers.

Pointer, die Du von malloc bekommst, sollten an einer Paragraphengrenze 
starten. Dabei ist nicht garantiert, dass der Offset 0 ist. 
Normalisieren musst Du den Pointer selber, d.h. physikalische Adresse 
berechnen, durch 16 ergibt Segment, Rest ist Offset.

Das hättest Du jetzt auch in einem Buch nachlesen können.

> Oder ein von beiden welches ist bitte günstiger und schneller :
> *(p+63999) = 255; oder
> p[63999] = 255;

egal.

fchk
Der 8086 hatte noch keine MMU, noch keine pages, kein Swap..
Der hat 4 Segment register, CS, DS, ES, SS, und dazu gehoeren Pointer.
Also CS:IP, DS:DX, ES:EX, SS:SP. Jeder pointer kann 16 bit adressieren, 
das Segmentregister ist um 4 Verschoben. Die Adressen sind also 20Bit. 
Macht also 1MByte Adressraum.
Schade gab's kein DOS fuer den 386, der war naemlich viel besser, viel 
interessanter. Allerdings waeren viele damit ueberfordert gewesen.
Gast
Peter B. schrieb:
> Es kommt keine Fehlermeldung und die Werte werden ausgegeben.

Kommt die überhaupt?

Soweit ich weiß, wird der Speicher doch dann zur Laufzeit allokiert, was 
dann ggf. zu einem segfault führt, wenn nicht genügend 
(zusammenhängender) Speicher zur Verfügung steht.

Aber zur Compilezeit?
Achim schrieb:
> Soweit ich weiß, wird der Speicher doch dann zur Laufzeit
> allokiert, was dann ggf. zu einem segfault führt,

Unter DOS gibt es keine Segfaults. Gibt die Hardware nicht her.

> wenn nicht genügend (zusammenhängender) Speicher zur Verfügung steht.

Dann gibt malloc() einfach NULL zurück.
Was in jedem Segment ein gültiger Wert ist...
Joggel E. schrieb:
> Der hat 4 Segment register, CS, DS, ES, SS, und dazu gehoeren Pointer.
> Also CS:IP, DS:DX, ES:EX, SS:SP.

DX und EX sind keine Pointer-Register. Die Kombinationen sind DS:SI 
(source index) und ES:DI (destination index). Und dann gibt es noch den 
"base pointer" BP.

> Jeder pointer kann 16 bit adressieren, das Segmentregister ist um 4
> Verschoben. Die Adressen sind also 20Bit.
> Macht also 1MByte Adressraum.

+65520 Bytes. Da der 8086 aber nur 20 Adressleitungen hat, ist dort der 
untere Speicherbereich gespiegelt. Ab dem 286 konnte man aber 
tatsächlich den zusätzlichen Speicher ansprechen. Aus diesem Umstand 
stammt das berühmt-berüchtigte A20-Gate.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.