我正在尝试使用一些作业来理解一些操作系统基础知识。我已经发布了一个类似的问题并得到了令人满意的答案。但这一个略有不同,但我无法调试它。所以这就是我所做的:
我要做的是启动一个主程序,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 并打印“我是函数!k 是:0”。但是当单独运行时,这会产生分段错误。我很困惑通过这个结果。
任何帮助,将不胜感激。提前致谢。