代码之家  ›  专栏  ›  技术社区  ›  Jay Conrod

当给定受保护的内存时,我如何使系统调用调用我的SIGSEGV处理程序?

  •  2
  • Jay Conrod  · 技术社区  · 17 年前

    我正在开发一个记忆跟踪库,我们在那里使用 mprotect 删除对程序大部分内存的访问,并使用SIGSEGV处理程序在程序接触到单个页面时恢复对它们的访问。这在大多数时候都很有效。

    我的问题是,当程序调用系统调用(比如 read )对于我的库标记为无法访问的内存,系统调用只返回-1并设置 errno EFAULT 这以奇怪的方式改变了被测试程序的行为。我希望能够在系统调用实际进入内核之前恢复对系统调用的每一页内存的访问。

    fread 将呼叫

    1 回复  |  直到 17 年前
        1
  •  5
  •   DaveR    17 年前

    ptrace(2) PTRACE_SYSCALL 它允许您在系统调用进入和退出时停止进程。

    ptrace

    • 设置家长和孩子的ptrace,监控(至少) PTRACE_SYSCALL .
    • 子进程执行系统调用;并通知家长。
    • PTRACE_GETREGS PTRACE_SETREGS 更改子状态,而不是调用系统调用;子进程调用“内存未保护”例程。
    • 孩子没有保护,这是记忆;然后加薪 SIGUSR1
    • 父母抓 SIGUSR ,使用 还原以前保存的系统调用信息并恢复子系统。
    • 子进程恢复并执行原始系统调用。