Ja, ich mein ja nur. Weiss, das sind blöde Beispiele.
@legend Danke für dein Tut !!
@legend Danke für dein Tut !!
09. November 2026, 18:27
?#define KERNEL_STACK_SIZE 4096
typedef struct {
unsigned long *stack_base;
unsigned long *stack_ptr;
} Task;
Task *createTask(void *entry) {
// speicher für den stack anfordern
char *stack = malloc(KERNEL_STACK_SIZE);
if(stack == NULL)
return NULL;
// stack-pointer berechnen (stack wächst von oben nach unten)
unsigned long *sp = (unsgined long *)(stack + KERNEL_STACK_SIZE);
// alle register auf den stack pushen, die dein taskswitch code erfordert
// ss (wird vom iret gepopt)
*(sp--) = 0x10;
// esp (wird vom iret gepopt)
// in diesem beispiel muss der task selbst seinen esp auf einen gültigen wert setzen
*(sp--) = 0;
// eflags (wird vom iret gepopt)
// ich weiß nicht aus dem kopf, was für eflags richtig sind
*(sp--) = 0;
// cs (wird vom iret gepopt)
*(sp--) = 0x8;
// eip (wird vom iret gepopt)
*(sp--) = (unsigned long)entry;
// eax, ebx, ecx, edx, ebp, esi, edi
*(sp--) = 0;
*(sp--) = 0;
*(sp--) = 0;
*(sp--) = 0;
*(sp--) = 0;
*(sp--) = 0;
*(sp--) = 0;
// ds, es, fs, gs
*(stack--) = 0x10;
*(stack--) = 0x10;
*(stack--) = 0x10;
*(stack--) = 0x10;
Task *task = malloc(sizeof (Task));
if(task == NULL)
return NULL;
task.stack_base = stack;
task.stack_ptr = sp;
return task;
};IRQ0 = Timer
dw 0000h ;always zero
dw task1_tss_selector ;Task State Segment Selektor
db 00h ;always zero
db 10000101b ;type
dw 0000h ;always zero
?? Ginge es auch einfacher
?
?
??Zuerst SS, dann ESP, EFLAGS, CS und EIP. Sowie ich oben beschrieben hatte. Auch wenn CS und die anderen Segmentregister nur ein Word sind, sind wie du warscheinlich weißt alle Stackelemente 4 Bytes (also ein DWORD) groß. Der Beispielcode von mir oben müsste eigentlich funzen, ich habe ihn aber nicht getestet.^^
mov esp,0x80000 ;Stack vom neuen Task laden
push ss ;ss und esp auf den Stack
push esp
mov eax,0x0 ;Die EFLAGS mit lauter nullen laden
push eax
mov ax,0x8 ;Der Selektor vom Codesegment
push ax
mov DWORD eax,neuerTask ;Offset vom Codeteil
push eax
xor eax,eax ;Alle Register auf 0 setzen
xor ecx,ecx
xor edx,edx
xor ebx,ebx
xor ebp,ebp
xor esi,esi
xor edi,edi
pushad ;Alle Register pushen, damit sie der Timer Interrupt laden kann.
mov esp,0x90000
Du pushst den falschen ESP auf den Stack, der ESP Wert auf dem Stack wird der ESP des Programms und nicht der Kernel-ESP des Programms.
) nicht der selbe sein, wie der des Programms
?
?
?