非正统linux内核和valgrind

非正统linux内核和valgrind,linux,kernel,valgrind,Linux,Kernel,Valgrind,首先,如果我在错误的地方写了这篇文章,让我道歉。 我似乎找不到一个valgrind用户论坛来发布这种性质的东西,因为这个地方似乎涵盖了所有方面,我想我应该试试 我有一个非正统的linux内核,我需要在运行代码时使用它。 我不太了解内核,因为我没有编写它。 不管出于什么原因,我的内核看起来像是扩展了默认linux内核的syscall表。 似乎发生的情况是,在.ko文件insmod时,当前的标准syscall表被扩展,从333开始,到341,原始syscall表被保存,并在.ko被rmmoded时恢

首先,如果我在错误的地方写了这篇文章,让我道歉。 我似乎找不到一个valgrind用户论坛来发布这种性质的东西,因为这个地方似乎涵盖了所有方面,我想我应该试试

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

当然,这似乎在玩弄瓦尔格兰德

我当然想用valgrind来检查我的程序,但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处,定义了\uuu NR\u preadv。 对我来说,valgrind在对名为my_ipc的东西执行系统调用时就死了,my_ipc是我内核特有的系统调用,在333处枚举。 valgrind编译所依据的内容与内核中实际发生的内容之间似乎存在系统调用映射错误。因此,syscall包装器valgrind在看到syscall 333无法真正处理syscall 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\u MISSING\u SYSCALL\u或_IOCTL
文件是向valgrind添加系统调用包装器的最佳起点


要回答您关于valgrind论坛的问题,您可以在freenode上找到,或者是
#valgrind
IRC频道。

它只是扩展了表格吗?这可能是因为它覆盖了一个条目,当valgrind进行系统调用时,它不是它想要的(这似乎是因为存在一个坏的访问),在进一步检查后,它覆盖了一个条目。这就是我所想的:)好的,所以我必须彻底地挖掘valgrind的构建,并为我的特定系统调用插入支持,嗯?我想没有简单的办法。我不确定是否有办法让两组系统调用在单个valgrind构建中共存,但这可能太难了。我想我可以保留两个单独的valgrind可执行文件。它们不能共存。不,因为系统调用完全由一个数字标识,并且您的内核添加了使用数字的自定义调用,这些数字与最近的上游内核添加的新调用冲突。所以valgrind无法知道,在您的机器系统上,333调用与正常情况不同。