【问题标题】:How would I lookup Linux syscalls by name/number in Go?如何在 Go 中按名称/编号查找 Linux 系统调用?
【发布时间】:2021-02-18 23:56:42
【问题描述】:

我想在 Go 中按名称/编号查找 amd64 和 i386 的 Linux 系统调用,并且想知道 Go 标准库或第三方模块中是否有可用的内置映射。

我可以在这里看到 Go 开发人员已将 Linux 系统调用号硬编码到 syscall 模块中:

看起来他们已经使用 GCC 生成了以下每个文件:https://golang.org/src/syscall/mksysnum_linux.pl

系统调用示例 (amd64):

// mksysnum_linux.pl /usr/include/asm/unistd_32.h
// Code generated by the command above; DO NOT EDIT.

// +build 386,linux

package syscall

const (
    SYS_RESTART_SYSCALL        = 0
    SYS_EXIT                   = 1
    SYS_FORK                   = 2
    SYS_READ                   = 3
    SYS_WRITE                  = 4
    SYS_OPEN                   = 5
    SYS_CLOSE                  = 6
...

最好的办法是在我的代码中对这个映射进行硬编码,还是在某个地方有维护的映射可用?

我不是在寻找特定 Linux 系统上系统调用名称/编号之间的映射,而是在 amd64/i386 上的任何(现代)Linux 系统上寻找系统调用名称/编号之间的(可能)映射。

我了解系统调用编号可能会发生变化,但这是一种尽力而为的方法。

【问题讨论】:

标签: linux go system-calls


【解决方案1】:

映射在内核源码中,例如一个架构的映射是/usr/include/asm/unistd_32.h

您应该与解析它的 perl 脚本一起阅读该文件,(该脚本只有一页长,并且匹配头文件中极少数的 #define 模式......模式将连续匹配多次,按名称和编号查找整个系统调用列表)

也可以参考这个问题(跨站欺骗):

【讨论】:

  • 我将编辑我的问题 - 我不是在寻找特定端点上的系统调用名称/编号之间的映射,而是在寻找任何系统调用名称/编号之间的(可能的)映射amd64/i386 上的 Linux 系统 - 它用于按系统调用名称/编号过滤审计事件。
  • @bp256r1: 你知道 amd64 和 i386 的数字不同吧?阅读链接的问题和答案以及我链接到的另一个。这些映射对于特定架构非常稳定,您无需担心此端点与那个特定内核版本,您确实需要知道什么架构,并针对最新的内核源进行查找,因为新的系统调用确实得到不时添加。
  • 是的,我知道系统调用号仅对于给定的架构是稳定的 - 我在原始问题中链接到两个不同的表 - 我认为系统调用号可能会因内核而异(例如,如果Oracle 添加了自己的系统调用什么的)。
  • @bp256r1:理论上,系统调用号在每个内核版本中都可能不同。但是,发生这种情况是非常不切实际的,因此任何添加系统调用的人要么提前计划并小心使用不需要更改的数字,要么......好吧,你可能应该避免该系统调用。 :-) (如果他们把那个搞砸了,他们还做错了什么?)
猜你喜欢
  • 2014-06-08
  • 2015-09-17
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-04
相关资源
最近更新 更多