栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

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

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

在x86-64 linux中,必须提供a,

sa_restorer
而您尚未提供。

内核源码的相关部分:

  if (ksig->ka.sa.sa_flags & SA_RESTORER) {         put_user_ex(ksig->ka.sa.sa_restorer, &frame->pretpre); } else {                  err |= -EFAULT; }

在C库包装为您完成此:

  kact.sa_flags = act->sa_flags | SA_RESTORER;  kact.sa_restorer = &restore_rt;

使用更新的代码,您确实确实有一个还原器,但是您有两个问题:它已损坏并且您将其错误传递。查看上面提到的C库源代码,您可以找到以下注释:

另外,由于函数序言,您不能将C
++函数用作恢复器。此外,

printf
不支持从信号处理程序进行调用(但可以在此处使用)。最后,正如大卫·沃尔弗德(David
Wohlferd)所指出的那样,您的clo语是错误的。总而言之,以下内容可能是重新设计的版本:

#include<stdio.h>#include<unistd.h>#include<time.h>void handler(int){    const char msg[] = "handlern";    write(0, msg, sizeof(msg));}extern "C" void restorer();asm volatile("restorer:mov $15,%raxnsyscall");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,%%raxn mov %0,%%rdin mov %1,%%rsin mov %2,%%rdxn mov $8,%%r10n syscalln "::"i"(7),"p"(&act),"p"(0):"rax","rcx", "rdi","rsi","rdx","r8", "r9", "r10", "r11"); nanosleep(&ts,0);}

它仍然很hacky,显然,您不应该这样做。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/412524.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号