linux内存访问信号,linux – 内存访问错误sys_rt_sigaction(信号处理程序)

在x86-64 linux中,必须提供sa_restorer而你还没有这样做.

/* x86-64 should always use SA_RESTORER. */

if (ksig->ka.sa.sa_flags & SA_RESTORER) {

put_user_ex(ksig->ka.sa.sa_restorer, &frame->pretcode);

} else {

/* could use a vstub here */

err |= -EFAULT;

}

kact.sa_flags = act->sa_flags | SA_RESTORER;

kact.sa_restorer = &restore_rt;

使用更新后的代码确实有一个恢复器,但是你有两个问题:它已经坏了,你传了错.看看上面提到的C库源代码,你可以find this comment:

/* The difference here is that the sigaction structure used in the

kernel is not the same as we use in the libc. Therefore we must

translate it here. */

此外,由于函数序言,您不能将C函数用作还原器.此外,不支持从信号处理程序调用printf(但在此处有效).最后,正如David Wohlferd指出的那样,你的咒语是错误的.总而言之,以下可能是一个返工版本:

#include

#include

#include

void handler(int){

const char msg[] = "handler\n";

write(0, msg, sizeof(msg));

}

extern "C" void restorer();

asm volatile("restorer:mov $15,%rax\nsyscall");

struct kernel_sigaction {

void (*k_sa_handler) (int);

unsigned long sa_flags;

void (*sa_restorer) (void);

unsigned long sa_mask;

};

struct kernel_sigaction act{handler};

timespec ts{10,0};

int main(){

act.sa_flags=0x04000000;

act.sa_restorer=&restorer;

asm volatile("\

mov $13,%%rax\n\

mov %0,%%rdi\n\

mov %1,%%rsi\n\

mov %2,%%rdx\n\

mov $8,%%r10\n\

syscall\n\

"::"i"(7),"p"(&act),"p"(0):"rax","rcx", "rdi","rsi","rdx","r8", "r9", "r10", "r11");

nanosleep(&ts,0);

}

它仍然是hacky,显然你不应该这样做.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值