Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: najjannaj am 08. September 2004, 13:50
-
Hallo,
Suche ein Tutorial oder einen Code mit dem ich den Rechner aus meinem OS heraus neu starten kann? Am besten wäre C aber ASM ist auch akzeptabel. Mein OS läuft im PMode!
Bin für jede Antwort Dankbar!
Vielen Dank
najjannaj
-
Blätter mal die verschiedenen Ausgaben von LowLevel durch, irgendwo stand da mal etwas von einem APM-Shutdown und einem reboot!
-
Hier der Code zum ausschalten des Computers:
MOV AX, 5300h
XOR BX, BX
INT 15h
MOV AX, 5304h
XOR BX, BX
INT 15h
MOV AX, 5301h
XOR BX, BX
INT 15h
MOV AX, 5307h
MOV BX, 1
MOV CX, 3
INT 15h
IRET
mfG Stafe
-
also im RM kann man den Rechner folgender Maßen rebooten (entnommen aus Low-Lvl-Magazin Ausgabe1)
db 0EAh
dw 0000h
dw 0FFFFh
ob das auch im PM klappt, weiß ich nicht.
-
Im Pm klappt das nicht (sollte zumindest nicht). Im PM benutzt du den Keyboard Controller zum resetten. Siehe Ralf Browns Liste PORTS.A
-
Funktioniert denn der Quelltext von stafe zum Ausschalten des Computers im PMode, oder muss man sich da auch Ralf Brown's Liste bedienen?
-
Da bei stafe ints genutzt werden is das im PM nicht möglich.
Für einen Reboot kann man auch den weg überein tripple fault gehn.
Man lässt in der IDT die Exceptionhandler auf beispielsweise datensegmente zugreifen, also als selektor ein datensegmenteselektor nehmen. Dannmussnur ein int ausgelöst werden und dann kommt meisten schond er neustart^^ Ich gehe da einen ähnlichen weg
-
Welchen Weg gehst du denn? Kannst du denn Code mal posten??
Danke!
-
Roshl posteteFür einen Reboot kann man auch den weg überein tripple fault gehn.
Ist leider nicht ganz richtig.
Ein Triple Fault erzeugt nur eine bestimmte Bus Condition, auf die das Mainboard reagiert. Von Mainboard zu Mainboard wird also ein Triple Fault anders verarbeitet. Manchmal gibts nen Reboot, manchmal hängt der Rechner einfach...
-
Ich dachte eigentlich Tripple fault erzeugt was auf ner Prozessorleitung, von da wärs ja immer gleich, hat bei mir bisher auch immer so gefunzt^^
Selbst wenn ich den Code poste würde dir das nix helfen, weil da Funktionen gebraucht werden die abhängig davon sind wo deine IDT steht.
Vorgehensweise in etwa:
int's aus
INT 0xD alles 0 setzten
INT 0x8 alles 0
IRQ 0x0 alles 0
int's an
Reihenfolge erst 0xd dann 0x8 ist wichtig sonst unterbricht dich die General Fault protection^^ war jedenfalls bei mir so und beim nächsten Timer interrupt kommts dann zum Tripplefault
-
Sorry, aber durch deine kleine Anleitung versteh ichs trozdem nicht, poste einfach mal deinen Code, ich versteh nur C! ASM bin ich noch am lernen! Aber mit Beispielcode's lerne ich Viel viel schneller als duch erklärungen!
Trozdem Danke!
-
da liegt ja der hund begraben;) meine Routinen dazu sind ja in asm.
Der C(++)-teil sieht dazu so aus:
void restart()
{
cli();
setint(0xD,0,0,0);
setint(0x8,0,0,0);
setint(0x20,0,0,0);
sti();
while(){}
}
das nützt dir nix;) Und wenn du mit asm nicht viel anfangen kannst bringt dir mein setint auch sehr wenig:
_setint:
push ebp
mov ebp,esp
push eax
push edx
push edi
push es
mov ax,IDTData
mov es,ax
mov eax,8
mov edx,[ebp+8]
mul edx
mov edi,eax
mov eax,[ebp+12]
and eax,0x0000FFFF
stosw
mov ax,cs
stosw
xor eax,eax
stosb
mov eax,[ebp+20]
shl eax,5
add eax,10000000b
add eax,[ebp+16]
stosb
mov eax,[ebp+12]
shr eax,16
and eax,0x0000FFFF
stosw
pop es
pop edi
pop edx
pop eax
mov esp,ebp
pop ebp
ret
hier wird davon ausgegangen das ein Datensegment für die IDT vorhanden ist das dann direkt angesprochen werden kann.
Naja versuch was draus zu machen;)