Linux kernel 未定义的异常处理程序(_und_svc)在kprobes中的角色是什么?

Linux kernel 未定义的异常处理程序(_und_svc)在kprobes中的角色是什么?,linux-kernel,arm,armv7,systemtap,kprobe,Linux Kernel,Arm,Armv7,Systemtap,Kprobe,我试图将kprobe转换为可加载的内核模块 我可以从运行samples/kprobes/文件夹中的样本 内核树 如果我们在内核中配置kprobes(CONFIG\u kprobes),那么svc\u entry宏将在\u und\u svc()处理程序中扩展64字节 参考资料: 我的目标是在不触及内核方面的情况下,将kprobe作为内核模块 所以内核是在不启用CONFIG_kprobe的情况下编译的。因此,svc_entry宏将在 我想消除这些疑虑 如果处理了未定义的指令异常(bcos kp

我试图将kprobe转换为可加载的内核模块

我可以从运行
samples/kprobes/
文件夹中的样本 内核树

如果我们在内核中配置kprobes(
CONFIG\u kprobes
),那么
svc\u entry
宏将在
\u und\u svc()
处理程序中扩展64字节

参考资料:

我的目标是在不触及内核方面的情况下,将kprobe作为内核模块

所以内核是在不启用CONFIG_kprobe的情况下编译的。因此,svc_entry宏将在

我想消除这些疑虑

  • 如果处理了未定义的指令异常(bcos kprobe 仅创建),那么为什么调用
    \u und\u svc()
    \u und\u svc()
    处理程序在kprobes方面扮演什么角色

  • 如果64字节内存是必需的,那么如何在没有 编译内核。i、 e如何动态地进行


  • 请分享您的知识。

    您可能不会得到响应,因为您对事物的理解不是很好,linux arm内核列表中的任何人都需要一些时间才能做出响应。详细阅读并研究ARM架构

    如果kprobe被处理为未定义的指令异常(仅创建bcos kprobe),那么为什么调用
    \u und\u svc()
    \u und\u svc()
    处理程序在kprobes方面的作用是什么

    在ARM上,模式
    0b11011
    是未定义的指令模式。发生未定义指令时的流为

  • lr_und=未定义指令的pc+4
  • SPSR_und=指令发生的模式的CPSR
  • 将模式更改为ARM,并禁用中断
  • PC=向量基+4
  • 第四步的主向量表位于,它只是分支到 . 该代码是一个名为的宏,它描述了调用
    \uu und\u svc
    \uund\u usr
    。堆栈是每个进程保留的4/8k页面。它是包含任务结构和内核堆栈的内核页面

    kprobe的工作原理是将未定义的指令放在您希望探测的代码地址上。即,它涉及未定义的指令处理程序。这应该是很明显的。它调用两个例程,或者。您对第二种情况感兴趣,它获取操作码并调用
    call\u undef\u hook()
    。加上一个钩;你可以看到。使用
    结构pt_regs*regs
    调用主回调,该结构恰好是
    \uu und_svc
    中保留的额外内存。例如,请注意,它正在对当前正在使用的堆栈玩把戏

    如果64字节内存是必需的,那么如何在不编译内核的情况下进行分配。i、 e如何动态地进行

    不,不是。您可以使用不同的机制,但可能必须修改kprobes代码。很可能您必须限制功能。还可以完全重新写入堆栈帧,并在事件发生后保留额外的64字节。它不是
    kmalloc()
    中的分配。它只是从监控器堆栈指针中添加/减去一个数字。我猜代码会从未定义的处理程序中重新写入返回地址,以便在kprobed地址的上下文(ISR、下半部分/线程IRQ、工作队列、内核任务)中执行。但可能还有一些您尚未遇到的其他问题。如果从未调用过
    arch\u init\u kprobes()
    ,那么您可以始终在
    \uu und\u svc
    中进行预订;它只消耗64字节的堆栈,这使得内核堆栈更有可能溢出。换,

    __und_svc:
        @ Always reserve 64 bytes, even if kprobe is not active.
        svc_entry 64
    

    arch\u init\u kprobes()
    是实际安装该功能的工具。

    虽然我喜欢精确的问题,但恐怕这个问题太具体了。您也尝试过与内核相关的邮件列表吗?是的。我把这个问题发布在systemtap邮件列表和linux arm邮件列表上。linux arm中的厄运尚未发布。感谢您的启发
    call\u undf\u hook()
    相关内容。信息量更大。但是我无法从条目armv.S更改u und_svc()。在提交
    d30a0c8bf99f0e6a7d8c57bd4524039585ffbced中,仅添加此64字节。所以我试图理解,他们添加了哪些功能/bug。只需修补内核。使用调整任务的代码设置条目armv.S、
    svc\u条目
    ,然后始终使用
    svc\u条目64
    。你不需要拉完整的补丁集<代码>git diff d30a0c8bf99~1..d30a0c8bf99
    为我提供了完整的补丁。您可以保存它并运行
    echo svc_entry.patch | patch-p1
    。或者,您是否在询问是否无法重新编译内核并修复此问题?这几乎是不可能的;您必须重新编写所有的arm/kernel/kprobes.c代码。我的要求是,在不对内核应用任何补丁或甚至单个更改的情况下,将kprobes修改为LKM。因此,除了重写arm/kernel/kprobes.c之外,我没有其他选择。