【问题标题】:Where is source code for linux kernel syscall service routines?linux内核系统调用服务例程的源代码在哪里?
【发布时间】:2020-04-04 04:59:49
【问题描述】:

我对系统调用(高级)工作流程的理解是:

  1. 用户调用 libc 包装器
  2. 包装器将系统调用号和参数放在正确的位置、寄存器或堆栈中
  3. wrapper 执行 syscall 或 int 0x80 指令
  4. 内核中断处理程序调用 sys_xxx() 服务例程

如果是这样,那么内核源代码中应该有一堆 sys_xxx() 函数。例如,对于read(),在内核 2.6 代码中,我找到了sys_read。但是,在内核 5.4 代码中,我没有找到这样的服务例程代码,我发现的唯一 sys_read 就像是 libc 包装器的替代品。所以我很困惑..

一个相关的问题 - 内核将实现放在 sys_xxx() 中的原因是内核空间也可以调用这些函数,对吗?

【问题讨论】:

标签: c linux-kernel system-calls


【解决方案1】:

内核确实定义了一个名为sys_read 的函数,其行为如您所说。通过搜索很难找到它,因为它是通过使用token concatenation 的辅助宏定义的。见fs/read_write.c line 595:

SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
{
    return ksys_read(fd, buf, count);
}

这具有以下效果:

  • 将名为sys_readaliased 的函数声明为__se_sys_read

  • 定义__se_sys_read,显然对任何32位参数进行符号扩展,然后调用__do_sys_read

  • 定义__do_sys_read,其主体如图所示(即调用ksys_read,它执行实际工作)。

您可以在include/linux/syscalls.h line 206 看到SYSCALL_DEFINEx 宏的定义。

【讨论】:

    猜你喜欢
    • 2011-04-29
    • 2013-07-13
    • 2014-01-27
    • 1970-01-01
    • 2011-09-24
    • 2017-12-25
    • 2011-11-16
    • 1970-01-01
    • 2012-04-26
    相关资源
    最近更新 更多