Brotkrumen
Cadet 4th Year
- Registriert
- Feb. 2010
- Beiträge
- 97
Hallo!
Hintergrund: Das soll der Grundstein für einen preemptiven Scheduler sein. Also in einem Intervall ein Signal generieren, im Signal Handler den laufenden Thread-State speichern, Stack austauschen, neuen Thread loslaufen lassen.
Dabei versuche ich eine Funktion aufzurufen indem ich sie aus meinem Signalhandler raus anspringe. Das mit inline ASM indem ich einfach den Instruction Pointer umbiege:
Danach läuft die Funktion auch los, es kommen jedoch keine Signale mehr an. Weder über alarm(x) noch kill(pid...). Gleiches passiert, wenn ich einen extra signalstack anlege.
Anbei minimal working example. Einfach in .c umbenennen. Geht nur in Linux, wegen signals und so. Compile:
gcc -Wall ult_dev.c -o ult_dev
Jemand eine Idee warum keine Signale mehr erzeugt werden, bzw. warum sie den Prozess nicht anhalten?
Hintergrund: Das soll der Grundstein für einen preemptiven Scheduler sein. Also in einem Intervall ein Signal generieren, im Signal Handler den laufenden Thread-State speichern, Stack austauschen, neuen Thread loslaufen lassen.
Dabei versuche ich eine Funktion aufzurufen indem ich sie aus meinem Signalhandler raus anspringe. Das mit inline ASM indem ich einfach den Instruction Pointer umbiege:
Code:
__asm__ __volatile__ (
"mov %0, 8(%%rbp);"
::"r" (sched->pTcb->func)
);
Danach läuft die Funktion auch los, es kommen jedoch keine Signale mehr an. Weder über alarm(x) noch kill(pid...). Gleiches passiert, wenn ich einen extra signalstack anlege.
Anbei minimal working example. Einfach in .c umbenennen. Geht nur in Linux, wegen signals und so. Compile:
gcc -Wall ult_dev.c -o ult_dev
Jemand eine Idee warum keine Signale mehr erzeugt werden, bzw. warum sie den Prozess nicht anhalten?