首页 > 解决方案 > linux内核系统调用服务例程的源代码在哪里?

问题描述

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

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

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

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

标签: clinux-kernelsystem-calls

解决方案


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

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

这具有以下效果:

  • 声明一个名为 的函数sys_read别名__se_sys_read

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

  • 定义__do_sys_read谁的主体如图所示(即调用ksys_read哪个执行实际工作)。

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


推荐阅读