【问题标题】:How to find system call implementations in Linux/Android 2.6.29?如何在 Linux/Android 2.6.29 中找到系统调用实现?
【发布时间】:2013-01-01 13:25:35
【问题描述】:

我想修改一些系统调用以进行跟踪。具体来说,每当进行系统调用open 时,我都想打印一些消息。

我一直在寻找互联网和代码,我在kernel/goldfish/fs/ 目录中找到了open.c。而且这个文件里有很多功能。我怎么知道确切地调用了哪个函数。我本可以在所有这些函数中编写一些 printk 调用来找到它,但我也必须为其他系统调用这样做。

所以,我有几个问题,

1) 查找系统调用实现细节的最佳方法是什么?

2) 我正在使用内核 2.6.29 (goldfish-Android)。不同内核版本的系统调用实现是否不同?

3) strace 告诉我正在进行 msggetmsgrecv 和 'SYS_24' 系统调用。我查看了Android/bionic/libc/SYSCALLS.txt 文件,但 msgget 不存在。

但是当我查看android/bionic/libc/kernel/arch-arm/asm/unistd.h 文件时,我可以在那里找到msgget。我不明白发生了什么,然后我怎样才能找到 msgget 的实现?

谢谢。

【问题讨论】:

  • StackOverflow 不是解决此类 Android 内部问题的好资源。 StackOverflow 主要用于解决与使用 SDK 构建应用程序相关的问题。如果您在这里没有得到答案,请前往 source.android.com,选择合适的 Google 群组,然后尝试在那里提问。
  • 大多数 Linux 系统(Android 本质上是一个 Linux 系统)可以使用ptrace 捕获系统调用。你调查过那条路线吗?
  • 这就是 strace 正在做的事情。但是可能使用的 strace 二进制文件有一个错误的系统调用编号表(为不同的版本构建)。
  • msgget() 和 msgrecv() 是 System V IPC 功能,Android 不支持 System V IPC,因为设计人员认为它存在潜在的拒绝服务问题。这强烈表明您使用的 strace 没有完全正确的系统调用表,但是 strace 对 ptraces 所做的是一个很好的方法,因此您可能会考虑重建它,或者只是为感兴趣的函数(希望那些在其表中是正确的)
  • 感谢 Googlegroup 和 ptrace 建议以及 msgget() 详细信息。我已经怀疑 strace 的输出了。

标签: android linux linux-kernel


【解决方案1】:

This link 提到了几乎所有的系统调用、它们的参数和各自文件中的位置。它帮助我找到了系统调用的详细信息。

Chris 在上面的 cmets 中给出了 strace 的答案,再次感谢他。

【讨论】:

猜你喜欢
  • 2013-01-01
  • 2016-05-25
  • 2015-05-24
  • 2010-10-04
  • 1970-01-01
  • 2012-09-19
  • 2020-09-21
  • 2014-10-15
  • 2022-01-10
相关资源
最近更新 更多