Я пытаюсь понять некоторые основы ОС, используя некоторые задания. Я уже опубликовал аналогичный вопрос и получил удовлетворительные ответы. Но это немного отличается, но я не смог его отладить. Итак, вот что я делаю:Ошибка сегментации, создающая поток пользовательского уровня с C и сборкой
Что я хочу сделать, это запустить основную программу, malloc пробел, использовать ее как стек, чтобы начать поток пользовательского уровня. Моя проблема связана с обратным адресом. Вот код до сих пор:
[я редактирую свой код, чтобы сделать его современным к текущему состоянию моего ответа]
#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 является сборка код, который я написал, как следующим образом:
.text
.globl switch_thread
switch_thread:
movq %rdi, %rsp
movq %rsi, %rbp
ret
Этот код работает очень хорошо под GDB и дает ожидаемый результат (который, передавая управление simple_function и печати «Я функция к является: 0». Но при запуске отдельно, это дает ошибку сегментации. Я сбив с толку этим результатом.
Любая помощь будет оценена по достоинству. Заранее спасибо.
Вам не кажется, что вы должны заботиться о других регистрах при вызове функции? – Alex
Не забудьте выровнять свой стек на 16. –
@AkiSuihkonen Это один момент, который я хочу уточнить. Не могли бы вы объяснить, почему он должен быть выровнен на 16? – user2290802