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