【问题标题】:Implementation of system calls / traps within Linux kernel sourceLinux内核源代码中系统调用/陷阱的实现
【发布时间】:2011-11-16 11:37:13
【问题描述】:

我目前正在学习有关操作系统的知识,即使用陷阱来促进 Linux 内核中的系统调用。我在 traps.c 中找到了陷阱表,并在 entry.S 中找到了许多陷阱的实现。

但是,我被指示在 Linux 内核中找到两个系统调用的实现,它们利用陷阱来实现系统调用。虽然我可以找到陷阱本身的定义,但我不确定在内核中对这些陷阱之一的“调用”会是什么样子。因此,我正在努力寻找这种行为的示例。

在任何人问之前,是的,这是家庭作业。

作为说明,我正在使用 Github 浏览内核源代码,因为 kernel.org 已关闭: https://github.com/torvalds/linux/

【问题讨论】:

  • 很好的家庭作业问题:)
  • 使用lxr.linux.no浏览linux源码。将为您节省大量时间;)
  • @rumpel:没听说过.. 看起来很普通。这里有什么特别之处是 vim+ctags 没有的吗?

标签: c linux-kernel kernel system-calls


【解决方案1】:

我被指示在 Linux 内核中找到两个系统调用的实现,它们利用陷阱来实现系统调用

每个系统调用都使用一个陷阱(如果我没记错的话,中断 0x80)因此“内核”位将在 PSW 中打开,并且处理器可以使用特权操作。

正如您提到的,系统调用在 entry.S 中的 sys_call_table: 下指定,它们都以“sys”前缀开头。

你可以在include/linux/syscalls.h中找到系统调用函数头,你可以在这里找到它: http://lxr.linux.no/#linux+v3.0.4/include/linux/syscalls.h

一般使用 lxr(正如上面的评论已经提到的)来浏览源代码。

无论如何,该功能是使用 SYSCALL_DEFINE1 或其他版本的宏实现的,请参阅 http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c

【讨论】:

  • 也有不需要中断的快速调用。我不确定它们是如何实现的,所以你必须用谷歌搜索,对不起。
  • @RedX 总的来说你是对的,但我很确定在 'sys_call_table` 下面的 Entry.S 中的系统调用是通过中断实现的(在简要阅读代码之后)
  • @RedX x86 中有 SYSENTER/SYSEXIT 指令,这可能是你想的:articles.manugarg.com/systemcallinlinux2_6.html
【解决方案2】:

如果您正在寻找实际的系统调用,而不是系统调用的实现,也许您想查看一些 C 库。为什么内核会包含系统调用? (我说的不是系统调用实现,我说的是例如实际的chdir 调用。有一个chdir 系统调用,这是一个更改目录的请求,并且有一个chdir 系统调用实现实际上改变了它并且必须在内核中的某个地方)。好的,也许某些内核也确实包含一些系统调用,但这是另一回事 :)

无论如何,如果我的问题正确,那么您不是在寻找实现,而是在寻找实际的电话。 GNU libc 对我来说太复杂了,但你可以尝试浏览dietlibc 的源代码。一些例子:

chdir.S

syscalls.h

【讨论】:

    【解决方案3】:

    对于 x86 架构,SYCALL_VECTOR (0x80) 中断仅用于 32 位内核。您可以在arch/x86/include/asm/irq_vectors.h 中查看中断向量布局。来自traps.ctrap_init() 函数是设置entry_32.S 中定义的陷阱处理程序的函数:

    set_system_trap_gate(SYSCALL_VECTOR, &system_call);

    对于 64 位内核,出于性能原因,使用新的 SYSENTER (Intel) 或 SYSCALL (AMD) 指令。来自arch/x86/kernel/cpu/common.csyscall_init() 函数设置了在entry_64.S 中定义并具有相同名称的“处理程序”(system_call)。

    对于用户空间的观点,您可能想看看this page(函数/文件名有点过时)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多