如何为 sigreturn 自己设置堆栈框架?

问题描述 投票:0回答:0

我正在尝试为系统调用

sigreturn
设置堆栈框架。系统调用读取堆栈顶部的信息(它是一个 ucontext_t 结构)并自动设置信号掩码并设置
rip
。但是我不擅长
asm
,这是我的代码:

#define _GNU_SOURCE

#include <pthread.h>
#include <ucontext.h>
#include <signal.h>
#include <unistd.h>
#include <time.h>
#include <malloc.h>

void sigreturn_to(ucontext_t *ctx) {
    register void *rsp __asm__("rsp");
    rsp -= sizeof(ucontext_t);
    *(ucontext_t*)rsp = *ctx;
    __asm__ __volatile__(
        "mov $15, %%rax\n\t"
        "syscall"
        :
        :
        :
    );
}

void come_here() {
    while (1) {
        printf("123\n");
    }
}

int main() {
    ucontext_t ctx;
    getcontext(&ctx);
    void *main_stack = malloc(40960);
    sigemptyset(&ctx.uc_sigmask);
    ctx.uc_link = NULL;
    ctx.uc_stack.ss_sp = main_stack;
    ctx.uc_stack.ss_size = 40960;
    makecontext(&ctx, come_here, 0);

    sigreturn_to(&ctx);
}

我的目标是将信号掩码和

jmp
原子设置为一个函数(siglongjmp和setcontext只是调用
sigprocmask
并设置
rip
,它们不是原子的)。所以我想用 sigreturn 系统调用来实现这个。

程序跳转到

come_here
函数失败,我想是我设置了错误的栈帧的原因。你能告诉我如何正确设置栈帧吗?

c linux assembly signals coroutine
© www.soinside.com 2019 - 2024. All rights reserved.