Linux kernel 未定义的异常处理程序(_und_svc)在kprobes中的角色是什么?
我试图将kprobe转换为可加载的内核模块 我可以从运行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
samples/kprobes/
文件夹中的样本
内核树
如果我们在内核中配置kprobes(CONFIG\u kprobes
),那么svc\u entry
宏将在\u und\u svc()
处理程序中扩展64字节
参考资料:
我的目标是在不触及内核方面的情况下,将kprobe作为内核模块
所以内核是在不启用CONFIG_kprobe的情况下编译的。因此,svc_entry宏将在
我想消除这些疑虑
\u und\u svc()
。\u und\u svc()
处理程序在kprobes方面扮演什么角色请分享您的知识。您可能不会得到响应,因为您对事物的理解不是很好,linux arm内核列表中的任何人都需要一些时间才能做出响应。详细阅读并研究ARM架构 如果kprobe被处理为未定义的指令异常(仅创建bcos kprobe),那么为什么调用
\u und\u svc()
。\u und\u svc()
处理程序在kprobes方面的作用是什么
在ARM上,模式0b11011
是未定义的指令模式。发生未定义指令时的流为
\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之外,我没有其他选择。