【问题标题】:Difference between System call and System call service routines系统调用和系统调用服务例程之间的区别
【发布时间】:2022-01-21 10:14:45
【问题描述】:

我正在了解系统调用的实际工作原理并学习了一个术语system call service routine。 我很困惑system callsystem call service routine 有什么区别?

例如,在 Linux 系统上,man syscalls 列出了所有系统调用,有一个系统调用execve() 来执行由路径名指定的新程序。后来我发现它实际上调用了系统调用服务例程sys_execveexecve()的系统调用号为1​​1(__NR_exevce)。因此,在sys_call_table向量中,条目11包含sys_execve()的地址。

__NR_exevce 是什么?我在哪里可以找到sys_call_table vector? 我还发现在 linux 上,系统调用服务例程通常具有 sys_xyz() 形式的名称,其中 xyz() 是系统调用。

【问题讨论】:

    标签: linux system-calls


    【解决方案1】:

    系统调用是抽象的。这是用户空间与内核之间通信的一种方式,通过将特定数据传递到特定于平台的特定寄存器。

    内核是一个程序。 Linux Kernel 是用 C 语言编写的。

    这里,“系统调用服务例程”是 C 编程语言中处理特定系统调用的函数的名称。

    所以用户空间程序调用系统调用号__NR_execve。在 x86 架构上,用户空间程序将数字 59 放在 eax 寄存器中,然后执行指令int 0x80。在内核中执行特定的系统调用处理例程,从而导致内核中的函数sys_execve()被执行。

    什么是__NR_exevce?

    C 编程语言中的一个宏,提供对与execve 系统调用关联的系统调用号的平台无关访问。它允许编写跨所有 Linux 平台的可移植程序,这些程序用 C 编程语言编写,在编译期间自动选择正确的平台特定系统调用号。在 arm 上 __NR_execve 是 11,但在 x86 上是 59,等等。参见 https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#Cross_arch-Numbers

    在哪里可以找到 sys_call_table 向量

    在内核源代码中。在长生不老药上搜索。 https://elixir.bootlin.com/linux/latest/ident/sys_call_table

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 2014-07-13
      • 2010-12-11
      • 2010-10-09
      • 2023-04-01
      • 1970-01-01
      • 2015-07-01
      相关资源
      最近更新 更多