Linux内核syscall服务例程的源代码在哪里?

问题描述 投票:1回答:1

我对syscall(高级)工作流程的理解是:

  1. 用户调用libc包装器
  2. 包装器将系统调用号和参数放在正确的位置,寄存器或堆栈中
  3. 包装程序执行系统调用或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个回答
0
投票
内核确实定义了一个名为sys_read的函数,其功能与您所说的一样。通过搜索很难找到它,因为它是使用token concatenation通过帮助程序宏定义的。参见fs/read_write.c line 595

fs/read_write.c

具有以下效果:

  • 声明一个名为SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count) { return ksys_read(fd, buf, count); } sys_readaliased的函数
  • 定义__se_sys_read,它显然对任何32位参数进行符号扩展,然后调用__se_sys_read
  • 定义其主体如图所示的__do_sys_read(即调用__do_sys_read进行实际工作)。

您可以在ksys_read处看到SYSCALL_DEFINEx宏的定义。

© www.soinside.com 2019 - 2024. All rights reserved.