在C中自定义处理内存读写-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

在C中自定义处理内存读写

几许相思几点泪 2019-12-29 20:51:06 3076

我正在编写自己的文章,malloc并使用LD_PRELOAD技巧来使用它。我需要能够对读取和写入的每个内存访问都执行自定义功能(性能不是问题,功能是目标)。

例如,对于一些类似的代码

int x = A[5];

我希望能够捕获读取的内容,(A + 5)而不是从该内存位置读取内容,而是返回我自己的自定义值以存储在中x。

到目前为止,我的想法是:

mprotect离开,处理生成的SIGSEGV,然后在处理程序中执行我需要做的事情。据我所知,我可以访问中的错误地址void *si_addr,但是我不确定如何区分读和写-即使我确实做到了,但我不确定如何处理写操作,因为我不知道要在处理程序中写入的值。 调整gcc以专门处理内存访问。据我了解,了解gcc代码需要花一些时间,除非它的IR /抽象程序可以方便地隔离内存加载/存储,否则我不确定这是多么实用。 任何建议表示赞赏。

存储 C语言
分享到
取消 提交回答
全部回答(1)
  • 几许相思几点泪
    2019-12-29 20:51:15

    最简单的方法是通过malloc(您可能想拥有mmap,munmap,mprotect,sig(action,nal等)...以获得完整的覆盖范围)。您的返回地址与有效的映射不对应,捕获SIGBUS + SIGSEGV,解释siginfo结构以修复您的进程,...但是,这在某种程度上仅限于在堆上进行操作,程序可以很容易地从中进行逃逸,如果如果您尝试捕获行为异常的程序,则该程序可能会损坏您的查找表。

    为了获得更全面的介绍,您可能需要看看gvisor,它被标为容器运行时沙箱。它的技术更接近调试器,因为它可以完全控制目标,捕获其故障,系统调用等,并管理其地址空间。为适应您的需求,可能需要进行少量手术。

    在任何一种情况下,发生故障时,都必须安装内存并重新启动程序或模仿指令。如果您要处理的是像riscv或ARM这样的干净体系结构,那么仿真并不是太糟糕,但是对于像x86这样的过度狂热的体系结构,您几乎需要集成qemu。如果采用类似gvisor的方法,则可以安装页面并设置单步标记,然后在单步陷阱上删除该页面,这样就不那么麻烦了。dtrace的前身叫atrace,它使用这种方法来分析缓存和tlb访问模式。

    听起来像是一个有趣的项目;我希望这会顺利。

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程