いくつかの割り当てを使用して、いくつかのOSの基本を理解しようとしています。私はすでに同様の質問を投稿しており、満足のいく回答を得ています。しかし、これは少し異なりますが、私はそれをデバッグすることができませんでした。だからここに私は何をすべきかです:セグメンテーションフォールトで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は私のように書いたアセンブリコードである[Iは、最新の私の答えの現在の状態にそれを作るために自分のコードを編集しています]このコードは、GDBの下で本当によく実行され、期待される出力(で、simple_functionに制御を渡すと、印刷できます「!私は機能していますが、kは次のとおりです。0」
.text
.globl switch_thread
switch_thread:
movq %rdi, %rsp
movq %rsi, %rbp
ret
以下。しかし、個別に実行する場合、この私はこの結果に困惑しています。
ご協力いただければ幸いです。前もって感謝します。あなたのコードで
関数呼び出しで他のレジスタを気にする必要はないと思いませんか? – Alex
スタックを16で整列させることを忘れないでください。 –
@AkiSuihkonenそれは私が明確にしたいひとつのポイントです。なぜそれが16で整列されるべきか説明していただけますか? – user2290802