Archiv verlassen und diese Seite im Standarddesign anzeigen : Interne Prozessorwarteschleife
Nukacola
02.08.2002, 00:51
Kann mir irgendjemand sagen wie ich die interne Prozessorwarteschleife löschen kann???
ging das nicht irgendwie mit nen jmp befehl oda so??
bye
Felix Kaiser
02.08.2002, 14:39
Welche Warteschleife? Die einzige die mir spontan einfällt, ist ein HLT Aufruf, der bis zum nächsten Interrupt wartet ...
Nukacola
02.08.2002, 15:05
hm naja das Problem ist folgendes wenn ich in den Protect modus schalte werden noch Real modus Befehle ausgeführt, was dann natürlich einen Absturz zu folge hat.
Und ich dachte das liegt an irgendeiner internen Prozessorwarteschleife oder so was.
Oder liegt das an etwas anderem??
bye
Felix Kaiser
02.08.2002, 17:05
Wenn du in den Protected Modus umschaltest, solltest du sofort nach dem du das Bit 1 in CR0 gesetzt hast, den PMode Stack sowie andere PMode Segmente mit den richtigen Selektoren bestücken, die GDT muss gültig sein, anschließend wird über einen 32-Bit FAR Jump der PMode Entrypoint angesteuert. Sobald du in diesem bist muss auch spätestens die IDT gesetzt werden und es werden keine 16-Bit Komandos mehr verarbeitet. Während der ganzen Sache müssen natürlich sämtliche IRQs deaktiviert sein und später dann auch richtig verwaltet (PIC umprogrammieren?). Eine Warteschleife gibt es in der CPU beim Switch nicht.
Nukacola
02.08.2002, 21:10
Deskriptor und gültige GDT hab ich
dann folgendes:
mov eax,cr0
or eax,1
mov cr0.eax
pmode:
mov dx,10h ;selector laden
mov ss,dx
wo komm der jmp hin ??
meinst du das sollte ich vor label pmode einfügen??
jmp far
dw (offset pmode)
Felix Kaiser
03.08.2002, 00:25
Nachdem in CR0 Bit 1 gesetzt ist, alle Segmente mit gültigen Selektoren belegen und ES:ESP muss auf den Stack-Entrypoint zeigen. Danach muss ein 32-Bit FAR Jump erfolgen:
db 66h,0EAh
dd ? ; Einstiegspunkt bei EIP
dd ? ; 32-Bit Codeselektor
Meinst du die CPU-Befehl-Queue, in der sich zum zeitpunkt des Umschaltens noch befehle befinden ?
Die kann man einfach mit
JMP label
@label:
ausleeren
Felix Kaiser
03.08.2002, 14:09
Der FAR Jump direkt zum PMode Entrypoint CS:EIP bewirkt aber dasselbe, von daher wäre ein solcher Jump irrelevant ;)
Nukacola
03.08.2002, 15:07
hey jetzt gehts auch... :)
nur nochmal so ne kleine Frage die db 66h das ist doch das Segment override Präfix oder??
(um dem Assembler 32 bit Operanden größe mitzuteilen)
Muß man das immer mit angeben ???
Erkennt der Assembler das nicht selbst??
ok und danke für eure Hilfe
Felix Kaiser
04.08.2002, 00:14
67h wäre 32-Bit Adressprefix in einem 16-Bit Modi, 66h wäre 32-Bit Operandenprefix. Da der Realmode ebenfalls nur 16-Bit Adressierung hat, musst du aus dem Jump ein 32-Bit FAR-Jump machen, über den Operandenprefix. Ansonsten kanns passieren, die CPU landet im Nirvana ...
Nukacola
04.08.2002, 01:48
und wie ist das bei
segment use32
da bräucht ich die Prefixe doch dann nur noch bei 16bit Zugriffen oder??
bye
Felix Kaiser
04.08.2002, 02:21
Exakt, allerdings wird 66h vom Compiler erzeugt, weil er das in der Regel automatisch erkennt bei 32-Bit Code. Ist zumindest beim Turbo Assembler so, zusätzliche 32-Bit Prefixes sind nur in 16-Bit Modi notwendig.
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.