Autor Thema: reboot oder auschalten  (Gelesen 5854 mal)

najjannaj

  • Beiträge: 75
    • Profil anzeigen
Gespeichert
« 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

vish

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 08. September 2004, 14:21 »
Blätter mal die verschiedenen Ausgaben von LowLevel durch, irgendwo stand da mal etwas von einem APM-Shutdown und einem reboot!

stafe

  • Beiträge: 35
    • Profil anzeigen
    • http://www.staticos.at.tf
Gespeichert
« Antwort #2 am: 08. September 2004, 14:59 »
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
mfG Stafe

TPSeverino

  • Beiträge: 33
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 08. September 2004, 15:10 »
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.

Lizer

  • Beiträge: 28
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 09. September 2004, 13:24 »
Im Pm klappt das nicht (sollte zumindest nicht). Im PM benutzt du den Keyboard Controller zum resetten. Siehe Ralf Browns Liste PORTS.A

vish

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 09. September 2004, 14:11 »
Funktioniert denn der Quelltext von stafe zum Ausschalten des Computers im PMode, oder muss man sich da auch Ralf Brown's Liste bedienen?

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #6 am: 09. September 2004, 15:05 »
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
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

najjannaj

  • Beiträge: 75
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 10. September 2004, 09:36 »
Welchen Weg gehst du denn? Kannst du denn Code mal posten??
Danke!

mastermesh

  • Beiträge: 341
    • Profil anzeigen
    • http://www.kostenloser-laptop.de/
Gespeichert
« Antwort #8 am: 10. September 2004, 15:12 »
Zitat
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...

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #9 am: 10. September 2004, 18:09 »
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
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

najjannaj

  • Beiträge: 75
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 13. September 2004, 09:42 »
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!

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #11 am: 13. September 2004, 18:07 »
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;)
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen