いくつかの割り当てを使用して、いくつかの OS の基礎を理解しようとしています。私はすでに同様の質問を投稿しており、満足のいく回答を得ています。しかし、これは少し異なりますが、デバッグできませんでした。だからここに私がすることがあります:
私がやりたいことは、メイン プログラムを開始し、スペースを 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 に渡し、「I am the function! k is: 0」と出力します)。しかし、個別に実行すると、セグメンテーション違反が発生します。困惑しています。この結果によって。
どんな助けでも大歓迎です。前もって感謝します。