gpt4 book ai didi

c - linux 内核系统调用服务例程的源代码在哪里?

转载 作者:行者123 更新时间:2023-12-05 01:38:51 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

内核确实定义了一个名为 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_read 的函数,aliased__se_sys_read

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

  • 定义正文如图所示的 __do_sys_read(即调用执行实际工作的 ksys_read)。

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

关于c - linux 内核系统调用服务例程的源代码在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59276859/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com