gpt4 book ai didi

linux - 非正统的 linux 内核和 valgrind

转载 作者:太空狗 更新时间:2023-10-29 11:10:38 25 4
gpt4 key购买 nike

首先,如果我写错了地方,请允许我道歉。我似乎无法找到一个 valgrind 用户论坛来发布这种性质的东西,而且由于这个地方似乎包罗万象,我想我会尝试一下。

我有一个不太正统的 linux 内核,我需要在运行我的代码时使用它。我不太了解内核,具体细节因为我没有编写它。无论出于何种原因,我的内核看起来都扩展了默认的 linux 内核的系统调用表。似乎发生的是,在 .ko 文件的 insmod 上,当前的标准系统调用表被扩展,从似乎是 333 开始,到 341,原始系统调用表被保存,并在 .ko 时恢复是 rmmoded。这些额外的系统调用似乎执行某种独特的 IPC 通信我正在运行的专有软件。

当然,这似乎与 valgrind 不相容。

我当然想使用 valgrind 来 memcheck 我的程序,但是 valgrind 总是崩溃我的应用程序立即执行系统调用。这是我从 valgrind 得到的输出,减去一些我宁愿的东西

==26045== Thread 2:
==26045== Syscall param preadv(vector) points to unaddressable byte(s)
==26045== at 0x4000982: ??? (in /lib/ld-2.9.so)
==26045== by 0x426C756: syscall (in /lib/libc-2.9.so)
==26045== by 0x4037430: com_lock (coms.c:114)


--23932-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--23932-- si_code=1; Faulting address: 0x165; sp: 0x63a6dde4

valgrind: the 'impossible' happened:
Killed by fatal signal
==23932== at 0x3809D5E0: vgSysWrap_linux_sys_preadv_before (syswrap-linux.c:3413)
==23932== by 0x380785CB: vgPlain_client_syscall (syswrap-main.c:1382)
==23932== by 0x38076330: vgPlain_scheduler (scheduler.c:929)
==23932== by 0x380A13E8: run_a_thread_NORETURN (syswrap-linux.c:98)
==23932== by 0x380A1732: vgModuleLocal_start_thread_NORETURN (syswrap-linux.c:268)
==23932== by 0x380A8AC8: ??? (in /usr/local/lib/valgrind/memcheck-x86-linux)

不幸的是,我不可能不使用这些额外的系统调用。我面临的挑战是如何应对它们。

到目前为止,我学到的是我可以在 valgrind 中指定新的和/或定制的系统调用包装器。不幸的是,当系统调用地址在我的运行时全部切换时,我不太清楚如何解决这个问题。

如果有人有为他们添加到内核的非标准系统调用编写 valgrind 系统调用包装器的经验(并且知道如何告诉 valgrind 切换包装器),请回复一些细节、引用资料和任何东西。我真的很感激。

我正在使用 valgrind 3.7,g++ 4.1.1 和基于 2.6.29 gentoo 构建的自定义内核(出于所有意图和目的,在加载我的专有内核模块之前,它是 2.6.29 gentoo)

编辑:

自从我第一次发帖以来,我发现了更多与此相关的事情。valgrind 似乎有一个名为 include/vki/vki-scnums-x86-linux.h 的文件。根据其中的评论(记住这里是 valgrind 3.7.0),它或多或少是 2.6.9 内核中 asm-i386/unistd.h 的剪切和粘贴。在指令枚举 333,__NR_preadv 被定义。对我来说,valgrind 在为名为 my_ipc 的东西执行系统调用时死掉,这是我的内核独有的系统调用,枚举为 333。似乎在编译 valgrind 和内核中实际发生的事情之间存在系统调用映射错误。因此,系统调用包装器 valgrind 在发现系统调用 333 无法真正处理系统调用 333 时尝试调用,因为函数调用签名可能不匹配。

我认为 preadv 看起来像...

preadv(int fd, const struct iovec *iov, int iovcnt, off_t offset);

据我所知,我的 ipc 调用看起来像

asmlinkage long my_ipc (uint, long, long, long, long, long);

最佳答案

基本上,您要解决此问题的唯一方法是修改 valgrind 以删除对与自定义​​系统调用冲突的系统调用的支持,并至少添加对自定义系统调用的最小支持。就目前而言,valgrind 正试图将自定义系统调用的参数解释为就好像它是使用相同插槽的标准系统调用一样。

valgrind 源代码树根目录中的 README_MISSING_SYSCALL_OR_IOCTL 文件是获取有关如何向 valgrind 添加系统调用包装器的指南的最佳起点。

要回答有关 valgrind 论坛的问题,请访问 mailing lists ,或 freenode 上的 #valgrind IRC channel 。

关于linux - 非正统的 linux 内核和 valgrind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9402739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com