Próbuję zakodować prostą bibliotekę wątków na poziomie użytkownika jako ćwiczenie dla mojego kursu OS. Jako pierwszy krok próbuję uruchomić program i przejść do funkcji opuszczającej pierwszy program. Kod tej pory to:Kodowanie prostego wątku z C i złożeniem
Wstępny program:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#define STACK_SIZE (sizeof(void *) * 512)
void proc2() //This is the function that should run as the thread.
{
int i;
for(i=0;i<30;i++)
{
printf("Here I am!\n");
sleep(0.5);
}
exit(0);
}
void* malloc_stack() //used to malloc the stack for the new thread.
{
void *ptr = malloc(STACK_SIZE + 16);
if (!ptr) return NULL;
ptr = (void *)(((unsigned long)ptr & (-1 << 4)) + 0x10); //size align
return ptr;
}
int main()
{
int *bp, *sp;
sp = malloc_stack();
bp = (int*) ((unsigned long)sp + STACK_SIZE);
proc1(&proc2,sp,bp); //the actual code that runs the thread. Written in assembly
assert(0);
}
A potem napisałem prosty kod montaż nazwie PROC1 który przyjmuje trzy argumenty, wskaźnik do funkcji (używany jako wskaźnik instrukcji), stos wskaźnik i wskaźnik bazowy oraz zastąpienie obecnych rejestrów tymi wartościami. Kod, który napisałem, to:
.globl proc1
proc1:
movq %rdx, %rbp #store the new base pointer
movq %rsi,%rsp #store the new stack pointer
jmp %rdi #jump to the new instruction pointer.
Ale po uruchomieniu tego kodu otrzymuję błąd segmentacji. Proszę pomóż mi znaleźć błąd tutaj.
Dobrze to działa poprawnie, kiedy prowadził ją pod GDB stosując następujące polecenia:
gcc -g test.c switch.s
gdb a.out
run
ale kiedy rus sam jak w ./a.out, to nie działa !!!! Proszę o pomoc.
Z góry dziękuję.
na początek, to prawdopodobnie nie chcą "& PROC2" ... Q: Jaki jest Twój kompilator/debugger? GCC i GDB? Czy próbowałeś przejść przez twój kod pod debuggerem, patrząc na kluczowe zmienne po drodze? Jeśli nie, dlaczego nie? – paulsm4
Po napotkaniu przy segfault, programista zwykle uruchamia debuggera, aby zobaczyć, gdzie dokładnie wystąpił błąd seg, zwłaszcza jeśli segfault jest w 100% powtarzalny. Powinieneś też, a następnie ewentualnie zaktualizować pytanie. – hyde
@ paulsm4 Można używać '&' przy adresowaniu funkcji, a wiele osób ją preferuje, ponieważ (prawdopodobnie) czyni ją bardziej zrozumiałą co się dzieje. – hyde