Sto cercando di capire alcuni fondamentali del sistema operativo utilizzando alcuni compiti. Ho già postato una domanda simile e ho ottenuto risposte soddisfacenti. Ma questo è leggermente diverso ma non sono stato in grado di eseguire il debug. Quindi ecco cosa faccio:Errore di segmentazione durante la creazione di un thread a livello utente con C e assembly
Quello che voglio fare è avviare un programma principale, malloc uno spazio, usarlo come una pila per avviare un thread a livello utente. Il mio problema è con l'indirizzo di ritorno. Ecco il codice finora:
[sto modificando il mio codice per renderlo up-to-date allo stato attuale della mia risposta]
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define STACK_SIZE 512
void switch_thread(int*,int*);
int k = 0;
void simple_function()
{
printf("I am the function! k is: %d\n",k);
exit(0);
}
void create_thread(void (*function)())
{
int* stack = malloc(STACK_SIZE + 32);
stack = (int*)(((long)stack & (-1 << 4)) + 0x10);
stack = (int*) ((long)stack + STACK_SIZE);
*stack = (long) function;
switch_thread(stack,stack);
}
int main()
{
create_thread(simple_function);
assert(0);
return 0;
}
switch_thread è un codice assembly che ho scritto come segue:
.text
.globl switch_thread
switch_thread:
movq %rdi, %rsp
movq %rsi, %rbp
ret
questo codice viene eseguito molto bene sotto GDB e dà i risultati attesi (che è, passando il controllo per simple_function e la stampa: "io sono la funzione k è:! 0". Ma quando viene eseguito a parte, questo dà un errore di segmentazione.Mi sono sconcertato da questo risultato
Qualsiasi aiuto sarebbe apprezzato. Grazie in anticipo.
Non pensate che dovreste preoccuparvi di altri registri sulla chiamata di funzione? – Alex
Non dimenticare di allineare il tuo stack di 16. –
@AkiSuihkonen Questo è un punto che voglio chiarire. Puoi spiegare perché dovrebbe essere allineato per 16? – user2290802