我试图将k探头转换为可加载的内核模块。
我能够从内核树运行samples/kprobes/文件夹中可用的示例。
如果我们在内核(CONFIG_KPROBES)中配置k探针,那么svc_entry宏将被扩展为__und_svc()处理程序中的64个字节。
参考: http://lxr.free-electrons.com/source/arch/arm/kernel/entry-armv.S?a=arm#L245
我的目标是不触及内核的一面,把k探针作为内核模块。
因此,内核是在不启用CONFIG_KPROBES的情况下编译的。因此,svc_entry宏将在svc()中用0展开
我想从这些疑虑中解脱出来。
__und_svc()。__und_svc()处理程序在k探针方面的作用是什么?请分享你的知识。
发布于 2013-12-13 18:27:42
您可能不会得到响应,因为您对事情的理解不是很好,而且linux arm内核列表中的任何人都需要一些时间才能做出响应。阅读kprobes.txt并详细研究ARM的体系结构。
如果k探针是处理未定义的指令异常(只创建bcos k探针),那么为什么要调用
__und_svc()。__und_svc()处理程序在k探针方面的作用是什么?
在ARM上,模式0b11011是未定义的指令模式。当发生未定义指令时,
第四步的主要向量表位于__vectors_start,这仅仅是分支到vector_und。代码是一个名为vector_stub的宏,它可以调用__und_svc或__und_usr。堆栈是每个进程保留的4/8k页。它是包含任务结构和内核堆栈的内核页。
k探针的工作方式是将未定义的指令放置在希望探测的代码地址上。它涉及到未定义的指令处理程序。这应该很明显。它调用两个例程,call_fpe或do_undefinstr()。您对第二种情况感兴趣,它获取操作码并调用call_undef_hook()。使用钩()添加一个钩子;您可以看到arch_init_kprobes()。主回调kprobe_handler是用一个struct pt_regs *regs调用的,这恰好是在__und_svc中保留的额外内存。注意,例如,kretprobe_trampoline(),它正在玩弄当前正在执行的堆栈。
如果64字节内存是必需的,那么如何分配而不编译内核。也就是说,如何动态地完成它。?
不不是的。您可以使用不同的机制,但您可能必须修改k探测代码。很可能您将不得不限制功能。还可以完全重写堆栈帧,并在事实发生后保留额外的64字节。它是,而不是kmalloc()中的分配。它只是从监控程序堆栈指针中添加/减去一个数字。我猜想,代码会重写未定义处理程序的返回地址,以便在被探测地址的上下文(ISR、下半部分/线程IRQ、work_queue、内核任务)中执行。但你可能还没有遇到其他的问题。如果从来没有调用过arch_init_kprobes(),那么您可以始终在__und_svc中进行保留;它只消耗64字节的堆栈,这将使内核堆栈更有可能溢出。呃,换衣服,
__und_svc:
@ Always reserve 64 bytes, even if kprobe is not active.
svc_entry 64arch_init_kprobes()才是真正安装该功能的地方。
https://stackoverflow.com/questions/20560067
复制相似问题