C Linux signal handling funktioniert nach Stack verändern nicht mehr.

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:
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?
 

Anhänge

Es gibt nicht einen Grund in Assembler zu programmieren... Selbst im Linux Kerel wird alles was in asm geschrieben wurde , auf C umgestellt.

Vielleicht solltest Du die Frage lieber in einem Linux programmier irc channel stellen.
 
@nebulus Doch den gibt es, und zwar wenn man einzelne Register manipulieren muss. Es wird auch nicht alles umgestellt, sondern der bootcode für x86 und x86_64. Inline assembler kommt nach wie vor hier und da im kernel vor.

@Brotkrumen stell die frage doch mal im osdev forum - dort kann dir sicher jemand helfen. Hier auf der CB bezweifel ich das :P
 
Zurück
Oben