Autor Thema: Multitasking in meinem OS einbauen.  (Gelesen 19925 mal)

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #60 am: 11. December 2005, 15:12 »
Also, dann muss ich in meiner Tabelle eigentlich nur den Task des Programmes des Kernels speichern ????

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #61 am: 11. December 2005, 15:26 »
Hm? Ich versteh den Satz nicht^^

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #62 am: 11. December 2005, 15:36 »
In der Tabelle, die ich fürs Multitasking brauche muss ich also nicht den Stack des Tasks selbst (der Stack für Daten usw.)  eintragen, sondern den Stack des Tasks des Kernels (der, der benuzt wird, wenn ein Interrupt auftritt..).

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #63 am: 11. December 2005, 15:40 »
Ja, genau.

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #64 am: 11. December 2005, 15:53 »
Dann ist alles klar.

Danke!!!!
Nooooooooooos

nooooooooos

  • Beiträge: 734
    • Profil anzeigen
Gespeichert
« Antwort #65 am: 17. December 2005, 11:10 »
Das erstellen eines Tasks funzt halt immer noch nicht. Ich progge in Assembler und wäre froh, wennn mir einer ein Code-Beispiel geben würde. Ich poste hier mal meinen Code. Was ist daran falsch ????
Stackpointer:
heip:
dd 0
hcs:
dd 0x8
heflags:
dd 0x3202
hesp:
dd 0x70000
hss:
dd 0x10

Die Adresse die das Label Stackpointer beinhaltet steht in meiner Task-Tabelle. EIP wird während der Laufzeit mit der Adresse eines Tasks geladen. Der Fehler tritt dann auf, wenn nach dem iret des Timers versucht wird, eben diese Daten zu laden. Bochs meldet: "Can_push(): esp < N" und dass eine 12. Exeption aufgetreten ist.


Gruss Nooooooooos

SSJ7Gohan

  • Beiträge: 398
    • Profil anzeigen
Gespeichert
« Antwort #66 am: 17. December 2005, 11:48 »
Hm, in Assembler müsste das so aussehen:
task_ss equ 0x10
task_esp equ 0x70000
task_eflags equ 0x3202
task_cs equ 0x8

task_eax equ 0
task_ebx equ 0
task_ecx equ 0
task_edx equ 0
task_esi equ 0
task_edi equ 0
task_ebp equ 0

; 1024 elemente großen stack erstellen
[section .bss]
resd 1024
task_stackbase:

[section .text]
; erstellt einen neuen task
; erwartet den eip in eax
; und gibt den sp des kernelstacks in eax zurück

create_new_task:
; später solltest du den speicher für den stack dynamisch allokieren
mov [task_stackbase - 4], task_ss
mov [task_stackbase - 8], task_esp
mov [task_stackbase - 12], task_eflags
mov [task_stackbase - 16], task_cs
mov [task_stackbase - 20], eax
mov [task_stackbase - 24], task_eax
mov [task_stackbase - 28], task_ebx
mov [task_stackbase - 32], task_ecx
mov [task_stackbase - 36], task_edx
mov [task_stackbase - 40], task_esi
mov [task_stackbase - 44], task_edi
mov [task_stackbase - 48], task_ebp
mov eax, task_stackbase - 48
ret

task_switch_isr:
push eax
push ebx
push ecx
push edx
push esi
push edi
push ebp

; scheduler aufrufen und nächsten task bestimmen
; dann esp switchen

; eoi senden
mov al, 0x20
out 0x20, al

pop ebp
pop edi
pop esi
pop edx
pop ecx
pop ebx
pop eax

iret


btw, bei ring0 tasks wird kein SS und ESP auf den stack gepusht (und vom iret auch nicht gepopt), wenn ein interrupt eintritt. Wenn der Ring nicht gewechselt wird, ändert sich der ESP auch nicht beim Interrupt.

 

Einloggen