Forum: PC Hard- und Software FLAT-Memory-Modus


von Manfred Stark (Gast)


Lesenswert?

Hallo zusammen,
mein Hobby ist “Programmieren mit Assembler”. Ich habe mir mit NASM ein 
kleines
Programm erstellt, mit dem ich gewisse Speicher-Adressen untersuchen und 
auch
beschreiben kann. Das funktioniert auch mit dem PC (Prozessor Pemtium ® 
4) sehr
gut. Das Programm läuft im Real-Modus und wird von einer selbst 
geschriebenen
Boot-Rutine mittels USB-Stick gestartet. Wenn ich den Stick in einem 
Notboock
starte, geht das auch, allerdings mit einer Ausnahme: Sobald ich eine 
Adresse
lesen oder beschreiben will, die größer ist als 0x0000FFFF, stürzt mein 
Programm
offensichtlich ab.
Meine Frage ist jetzt folgende: Kann man bei einigen Pentium´s den 
Flat-Memory-
Modus ein- und ausschalten ? Wenn ja, wie ? Das Notboock hat laut Bios 
einen
Pentium P6200. Es wäre schön, wenn mir jemand von euch helfen könnte.

von Nano (Gast)


Lesenswert?

Manfred Stark schrieb:
> Sobald ich eine
> Adresse
> lesen oder beschreiben will, die größer ist als 0x0000FFFF, stürzt mein
> Programm
> offensichtlich ab.
> Meine Frage ist jetzt folgende: Kann man bei einigen Pentium´s den
> Flat-Memory-
> Modus ein- und ausschalten ? Wenn ja, wie ?

Stichwort Protected Mode und Paging.
https://de.wikipedia.org/wiki/Protected_Mode


Im Real Mode musst du dich mit Segmentregister und Offset herumquälen 
und der maximal adressierbare Speicher ist 2^20, allerdings nicht als 
Flat Memory.

von Georg (Gast)


Lesenswert?

Manfred Stark schrieb:
> lesen oder beschreiben will, die größer ist als 0x0000FFFF, stürzt mein
> Programm
> offensichtlich ab.

Das ist das Ende des ersten Segments - wenn du darüber hinaus schreibst, 
überschreibst du den Anfang dieses Segments, und da ist dein Programm, 
klassischer Fall von Selbstzerstörung. Dein Programm wäre nur zu etwas 
zu gebrauchen wenn es auch das Segmentregister setzen würde.

Georg

von Manfred Stark (Gast)


Lesenswert?

vielen Dank Georg!

Was du sagst, funktioniert natürlich.
z.B.
mov  ax, 0x1000
mov  ds, ax
mov  bx, 0
mov  [ds:bx], Byte 0x41
diese Funktion schreibt ein 'A' in die Adresse 0x00010000.

damit kann ich bis zu 1 MBytes adressieren. Aber mit meinem Pentium (R) 
4 kann ich mit folgendem Code bis zu 4 GBytes adressieren.

z.B
mov  edi, 0xFFFF0000
mov  [edi], Byte 0x41
diese Funktion schreibt ein 'A' in die Adresse 0xFFFF0000.

Das ist der sogenannte Flat-Memory-Modus. Genau das funktioniert aber 
bei dem Pentium P6200 nicht. Deshalb vermute ich, dass der 
Flat-Memory-Modus bei dem P6200 ausgeschaltet ist. Möglicherweise muss 
dieser nur eingeschaltet werden.

von (prx) A. K. (prx)


Lesenswert?

Manfred Stark schrieb:
> Kann man bei einigen Pentium´s den Flat-Memory-Modus ein- und ausschalten?

Man kann ihn einschalten. Ausschalten ist schon schwieriger, denn zurück 
geht (oder ging es anfangs) nur über Reset. Was manche nicht daran 
hinderte, mit OS/2 1.x ein Betriebssystem zu bauen, in dem routinemässig 
zigmal die Sekunde stattfindet.

Alle x86, die für PCs gebaut sind, starten im Real Mode, kompatibel zu 
Intels 8086/8088. Darin gibts nur 16-Bit Adressierung mit 1MB Limit. 
Man kann in den Protected Mode wechseln und der Wechsel will gut 
vorbereitet sein. Im Protected Mode gibts dann ab 386 auch 32-Bit 
Adressierung, flach oder segmentiert, und ab AMDs K8 gibts noch einen 
weiteren Modus mit flacher 64-Bit Adressierung.

> Möglicherweise muss dieser nur eingeschaltet werden.

Das "nur" ist ein recht komplexer Vorgang. Bissel mehr als Bit setzen.

: Bearbeitet durch User
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Wenn du mehr darüber wissen willst, schau dir DOS-Extender an,
der bekannteste dürfte DOS4GW sein. Damit war es möglich, 
protected-mode-Programme unter DOS auszuführen.

Falls Du "nur" mehr Speicher brauchst, schau nach XMS. Ich hatte 
damals(tm) ein Diskcopy-Programm geschrieben, was eine komplette 
Diskette Sektor für Sektor in den Speicher laden und somit ohne 
mehrfachen Wechsel kopieren konnte.

von Rolf M. (rmagnus)


Lesenswert?

(prx) A. K. schrieb:
> Alle x86, die für PCs gebaut sind, starten im Real Mode, kompatibel zu
> Intels 8086/8088. Darin gibts nur 16-Bit Adressierung mit 1MB Limit.

Das stimmt nicht ganz. Bei den 32-Bit-Prozessoren kann man auch im 
Realmode die 32-bittigen Offset-Register verwenden, um mehr Speicher 
anzusprechen. Zumindest früher gab es Prozessoren, wo das ging. Ob das 
bei allen Prozessoren möglich ist, weiß ich nicht. Soweit ich weiß, war 
das auch nie ein offizielles Feature der Prozessoren.

PS: Das nannte sich wohl "unreal mode":
https://de.wikipedia.org/wiki/Real_Mode#Unechter_Realmodus_(%E2%80%9EUnreal_Mode%E2%80%9C,_%E2%80%9EBig_Real_Mode%E2%80%9C)

: Bearbeitet durch User
von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

Das war der sogenannte "Unreal Mode" ab dem 80386, so daß man Zugriffe 
auf Adressen wie DS:[EBX] ausführen konnte, was im Real Mode zu einer 
Exception führt. War kein offizielles Feature sondern eher ein Glitch, 
wurde aber überraschend oft verwendet.

Der 80286 kann sowas ähnliches über die ich glaube ebenfalls 
unoffizielle LoadAll-Anweisung, wobei auch die im Real Mode versteckten 
Register(teile) beschrieben werden können und dadurch Zugriffe auf 
erweiterte Speicherbereiche möglich werden.

von Pandur S. (jetztnicht)


Lesenswert?

Das Umschalten des 386 vom Realmode in den protected mode ist eine eher 
auswendige Sache. Denn nicht nur wird das Memory gepaged, was das 
aufsetzen der memory management unit bedeutet, sondern es kommen auch 
Benutzerrechte. Diese nennen sich Ring0, Ring1, Ring2, im Ring0 laeuft 
das System, resp, der Kernel davon, nicht das GUI, Ring2 sind die 
Anwenderprogramme. Der Witz davon, Anwenderprogramme duerfen nicht auf 
das System zugreifen koennen. Und dort wo sie's duerfen steht ein 
Callgate, da werden die Zugriffen gehandelt.
Interrupts gehen nicht einfach auf irgendwelchen Code, sondern ueber ein 
Trapgate, welch das Handeln.
Das Ganze ist ein riesen Overhead, der erst einmal aufgesetzt werden 
muss.
Das Ganze waere moeglicherweise einfach, wenn man auf der gruenen Wiese 
beginnen koennte. Leider beinhaltet der Realmode schon Fehler, welche 
von Microsoft in Hardware eingebaut wurden. Heisst die Hardware 
funktioniert nicht wie's von Intel vorgegeben wurde, sondern anders, von 
mircosoft vermurkst. Daher muss die Betriebssystem Software diese fehler 
korrigieren, und der Programmierer muss erst mal die Details 
herausfinden.

von cppbert3 (Gast)


Lesenswert?


von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

> Leider beinhaltet der Realmode schon Fehler, welche von Microsoft
> in Hardware eingebaut wurden. Heisst die Hardware funktioniert nicht
> wie's von Intel vorgegeben wurde, sondern anders, von mircosoft
> vermurkst. Daher muss die Betriebssystem Software diese fehler
> korrigieren, und der Programmierer muss erst mal die Details
> herausfinden.
Watt is?!

Was ich heute empfehlen würde ist, sich mit dem "alten 16Bit-Assembler" 
gar nicht mehr so sehr zu beschäftigen bzw. nur wenn man es wirklich 
will oder muss, etwa weil man sich mit einem 8086 einen Ur-PC 
zusammengelötet hat oder so.

Dann lieber gleich mit 32- oder 64Bit-Assembler unter Windows anfangen. 
Dann hat man von Anfang an das gewünsche flat Speichermodell, die 
Programme können ohne großen Aufwand auf jedem Rechner ausgeführt werden 
und man braucht sich um die verhasste Segmentierung nicht mehr zu 
kümmern. Ich habe das zwar nie als schwer empfunden, aber viele hassen 
das.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.