Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: DOS und Win32-Konsole (nur Lesen) ::  Mehr Arbeitsspeicher in DOS nutzen?  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Thema geschlossen
Autor Nachricht
Developer30
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
Beitrag Developer30 Mitglied 18:40:07 15.07.2012   Titel:   Mehr Arbeitsspeicher in DOS nutzen?            Zitieren

Hallo,

ich schreibe ein Programm unter DOS mit Turbo C++ 3.0. Ich finde es allerdings schade, dass DOS scheinbar nicht mehr als 640 KiB Arbeitsspeicher hergibt. Ich habe in Google allerlei Dinge gelesen über DOS Extender und XMS, allerdings verstehe ich nicht, wie ich jetzt konkret vorgehen muss, um die 640 KiB Grenze zu überschreiten?

mfg
Developer30
Mechanics
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 1377
Beitrag Mechanics Mitglied 18:51:29 15.07.2012   Titel:              Zitieren

Warum tust du dir das an? Wen zum Geier interessiert das noch?
Developer30
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.05.2011
Beiträge: 25
Beitrag Developer30 Mitglied 18:59:13 15.07.2012   Titel:              Zitieren

Wozu gibt's denn ein Unterforum "DOS und Win32-Konsole"? Dann kann ich doch auch dem entsprechend eine Frage, die 1. mit C++ und 2. mit Dos zutun hat, stellen - oder nicht? Vielleicht ist hier ja wer, der (vielleicht sogar noch aus eigener Erfahrung von früher) mir hierzu was nützliches sagen kann.
Mechanics
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.01.2012
Beiträge: 1377
Beitrag Mechanics Mitglied 19:37:15 15.07.2012   Titel:              Zitieren

Es gab schon eine Frage hier, ob man das "DOS" nicht streichen sollte ;)

Natürlich kannst du die Frage stellen. Und ich gebs auch zu, ich kenne keine Antwort drauf. Aber ich finde es sehr verwunderlich, dass du dich mit sowas beschäftigst. Ich habe auch mal etwas für DOS programmiert, aber das ist schon sehr lange her, und schon damals hat DOS keine Sau interessiert. Aber es hatte einen gewissen Charme und war zu Windows 95 Zeiten halt noch nicht ganz tot. Aber ich hab das mehr zum Spass gemacht und habe mich in solche Probleme wie "zu wenig Arbeitsspeicher" nie reingedacht. Das Problem existiert seit über 30 Jahren nicht mehr. Ich seh wirklich überhaupt gar keinen Sinn, sich da jetzt noch reinzudenken. Es gibt viel wichtigere und interessantere Sachen, in die du dich reindenken könntest.
SG1
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.03.2001
Beiträge: 2555
Beitrag SG1 Mitglied 20:04:54 15.07.2012   Titel:              Zitieren

Such mal nach EMS und XMS. Das waren damals die beiden Wege, an mehr Speicher zu kommen. Aber keine Ahnung, ob man dazu noch großartig Doku findet.
knivil
Mitglied

Benutzerprofil
Anmeldungsdatum: 11.02.2009
Beiträge: 5874
Beitrag knivil Mitglied 10:58:36 16.07.2012   Titel:              Zitieren

Zitat:
(vielleicht sogar noch aus eigener Erfahrung von früher)
Ja, aber daran kann ich mich nur schwammig erinnern. Sowas wie highmem.sys und emm386.exe ...

_________________
If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.


Zuletzt bearbeitet von knivil am 10:58:56 16.07.2012, insgesamt 1-mal bearbeitet
nn
Mitglied

Benutzerprofil
Anmeldungsdatum: 02.10.2011
Beiträge: 252
Beitrag nn Mitglied 11:19:57 16.07.2012   Titel:              Zitieren

knivil schrieb:
Ja, aber daran kann ich mich nur schwammig erinnern.


Ja, ich auch.

Aber manche älteren Borland C++ (möglicherweise aber nicht die billigeren Turbos), konnten mit den DOS-Speichererweiterungen umgehen, das waren irgendwelche Einstellungen bei den Projektoptionen. Sollte auch in der zugehörigen Doku drin stehen.

Insbesondere mit BC++ 4 und 5 gab es auch 32-Bit DOS-Programme, die konnten mehrere MB Arbeitsspeicher verwenden. Die entsprechende DOS-Extender Software war da dabei.
merano
Mitglied

Benutzerprofil
Anmeldungsdatum: 21.12.2006
Beiträge: 412
Beitrag merano Mitglied 01:09:38 18.07.2012   Titel:              Zitieren

nn schrieb:
knivil schrieb:
Ja, aber daran kann ich mich nur schwammig erinnern.


Ja, ich auch.

Aber manche älteren Borland C++ (möglicherweise aber nicht die billigeren Turbos), konnten mit den DOS-Speichererweiterungen umgehen, das waren irgendwelche Einstellungen bei den Projektoptionen. Sollte auch in der zugehörigen Doku drin stehen.

Insbesondere mit BC++ 4 und 5 gab es auch 32-Bit DOS-Programme, die konnten mehrere MB Arbeitsspeicher verwenden. Die entsprechende DOS-Extender Software war da dabei.


BC++ 4 und höher lösen das 16 Bit Problem wohl nicht. Leider hatte Borland das
Problem damals nur für Turbo-Pascal elegant gelöst. das gipfelte sogar darin,
das Borland ensthaft vorgeschlagen hatte einen Turbo-Pascal Loader für Turbo-C
zu verwenden - Nicht sehr praktikabel, aber möglich.

OK. Das Know-How zu dem Thema findet sich "natürlich" im PC-Intern im Kapitel
"Erweiterungsspeicher".

@Mechanics: Die unselige Entscheidung von IBM den Speicher in "real-mode" auf
maximal 640 kB festzulegen kommt zwar aus 1980 hat uns leider noch bis in die 90er begleitet.

Also wenn man von DOS spricht ist Realmode mit gemeint und das begrenzt den
Speicher auf 1MByte. 1985 kam man auf die Idee den Speicher über 640kByte
als EMS-Speicher (Expandet Memory oder LIM-Standard) über ein verschiebbares
Speicherfenster verfügbar zu machen.

Zunächst muss man feststellen, ob EMS-Speicher sammt EMS-Treiber (EMM)
installiert sind. Es wird also ein Treiber mit dem Namen EMMXXXX0 und
Handler für den Interrupt 67h gesucht.
Return-Wert ist TRUE, wenn EMS-Speicher installiert ist, sonst FALSE.

C++:
1
2
3
4
5
6
7
8
9
10
BOOL ems_inst()
 {
  static char emm_name[] = { 'E', 'M', 'M', 'X', 'X', 'X', 'X', '0' };
  union REGS regs;      
  struct SREGS sregs;    
                                                             
  regs.x.ax = 0x3567;               /* Fkt: Interruptvektor 0x67 holen */
  intdosx(&regs, &regs, &sregs);    /* den DOS-Interrupt 0x21 aufrufen */
  return !memcmp( MK_FP(sregs.es, 10), emm_name, sizeof emm_name );
 }


*Der Code ist für den damals üblichen Borland-C geeignet.

Die Funktionen des EMM sind bei Erfolg dann über den Interrupt 67h nutzbar.

Als erstes wird die Gesamtanzahl der EMS-Pages ermittelt

C++:
1
2
3
4
5
6
7
8
9
10
11
12
BYTE emm_ec;             /* EMM-Fehler-Code */
int ems_num_page()
 {
  union REGS regs;    
                                                             
  regs.h.ah = 0x42;                 /* Fkt: Anzahl der Pages ermitteln */
  int86(0x67, &regs, &regs);        /* EMM aufrufen */
  if ((int) (emm_ec = regs.h.ah))  
   return(-1);                      /* Fehler aufgetreten */
  else                              
   return( regs.x.dx );             /* Gesamtanzahl der Pages zurueck */
 }


Dann kann man die Segmentadresse des EMS-Page-Frames ermitteln

C++:
1
2
3
4
5
6
7
8
9
10
11
WORD ems_frame_seg()
 {
  union REGS regs;  
                                                             
  regs.h.ah = 0x41;                 /* Fkt: Segmentadr. Page-Frame holen */
  int86(0x67, &regs, &regs);        /* EMM aufrufen */
  if ((int) (emm_ec = regs.h.ah))  
   return(EMS_ERR);                 /* Fehler aufgetreten */
  else                                
   return( regs.x.bx );             /* Segmentadresse zurueck */
 }


Mit Funktion 0x43 kann man dann Pages allokieren und mit Fkt 0x44 kann man
eine logische Seite auf eine physikalische Page mappen.
Der Pointer auf die physikalische Seite berechnet dann sich wie folgt:

C++:
#define PAGE_ADR(x) ((void *) MK_FP(ems_frame_seg() + ((x) << 10), 0))


Daneben gab es noch Extendet Memory mit dem man den Speicher wie heute üblich
"am Stück" ansprechen kann. Das funktioniert allerdings nur im Protected Mode.
_matze
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.07.2007
Beiträge: 10645
Beitrag _matze Mitglied 09:59:46 18.07.2012   Titel:              Zitieren

Mechanics schrieb:
Ich habe auch mal etwas für DOS programmiert, aber das ist schon sehr lange her, und schon damals hat DOS keine Sau interessiert. Aber es hatte einen gewissen Charme und war zu Windows 95 Zeiten halt noch nicht ganz tot.


Auch später war DOS nicht so ganz tot. Ich habe in meiner Ausbildung (bis 2004) hauptsächlich DOS programmiert (CA-Clipper). Wir haben damit noch unser Geld verdient. Zu der Zeit schon eine absolute Ausnahme, zugegeben. :)

_________________
Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?
Bitsy
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.05.2001
Beiträge: 510
Beitrag Bitsy Mitglied 12:48:24 18.07.2012   Titel:              Zitieren

Überlege mal, ob Du nicht besser den Open-Watcom-Compiler dafür nimmst.
Der bringt den DOS4GW-Extender mit, und dann kannst Du auf 32-Bit-Mode hoch und bis auf 16 MB linear durch programmieren. Entsprechende Beispiele sollten verfügbar sein. Der RealMode hat noch weitere Einschränkungen, die Du erst später merkst, z.B. Arraygrenzen von 64kb, enger Stack etc. Sowas nervt gewaltig.
c++.de :: DOS und Win32-Konsole (nur Lesen) ::  Mehr Arbeitsspeicher in DOS nutzen?  
Gehen Sie zu Seite 1, 2  Weiter
Thema geschlossen

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.