Autor Thema: Qemu stürzt ab bei Multitasking  (Gelesen 14547 mal)

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 30. December 2012, 19:35 »
Ja es geht jetzt. :-D

Abschließend wollte ich noch fragen was bringt der Sprung an 1b genau und was soll das 1: davor.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 30. December 2012, 19:45 »
Abschließend wollte ich noch fragen was bringt der Sprung an 1b genau und was soll das 1: davor.
'1:' ist ein Label zu dem du springen kannst, und weil es von dem mehrere geben kann bzw. gibt steht das b im sprung für 'backward'
es ist also ein Sprung zum letzten label 1 vor dem jmp.

entsprechend würde jmp 1f (f für forward) zum nächsten Label '1' springen, also in dem fall von task_a zu dem dem in task_b und in task_b wurde es vermutlich einen fehler auslösen weil es danach kein weiteres Label '1' mehr gibt
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 30. December 2012, 19:50 »
Das ganze soll dann eine Endlosschleife ergeben, damit die Funktion nicht zurückkehrt. while (1); sollte auch gehen.
Dieser Text wird unter jedem Beitrag angezeigt.

Martin Erhardt

  • Beiträge: 165
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 30. December 2012, 19:51 »
Vielen Dank für alles.
Wieso dürfen die Tasks in meinem Kernel eig nicht returnen?.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 30. December 2012, 19:55 »
Wohin sollten sie den springen? Auf dem Stack ist ja keine Rücksprungadresse.

Normale Programme beenden sich auch über einen Systemaufruf und nicht über ein return. (Auch wenn die Library/Programmiersprache oder das Betriebssystem deiner Wahl das eventuell so aussehen lässt.)
« Letzte Änderung: 31. December 2012, 15:56 von Jidder »
Dieser Text wird unter jedem Beitrag angezeigt.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 30. December 2012, 20:09 »
while (1); sollte auch gehen.
Nein das ist doch viel zu einfach  :-D

Ich glaube ich hatte zu erst ein „cli; hlt“ im Kopf und bin dann einfach bei asm geblieben.
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 31. December 2012, 15:38 »
Hallo,


Normale Programme beenden sich auch über einen Systemaufruf und nicht über ein return. (Auch wenn die Library/Programmiersprache deiner Wahl das eventuell so aussehen lässt.)
Die Programme im COM-Format von DOS konnten durchaus mit einem einfachen RET beendet werden aber in allen echten OSen ist dazu ein richtiger Systemaufruf erforderlich (schon um einen Return-Code/Error-Level/... mitzugeben, siehe exit() ).


Grüße vom Oberlehrer :-D
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 31. December 2012, 15:57 »
Da liegt dann allerdings der Wert 0 auf dem Stack, der veranlasst, dass die CPU in das PSP springt, wo der INT 0x20-Befehl steht. Aber ich hab mal meinen Post aktualisiert ;)
Dieser Text wird unter jedem Beitrag angezeigt.

 

Einloggen