ret_from_syscall 源代码和调用时间

ret_from_syscall source code and when it is called

在下面的调用跟踪中,我们看到名为 ret_from_syscall 的函数。 这是哪个功能? 什么时候会在系统调用期间调用? 这个对应的代码在哪里?

May  7 16:40:34.322086 warn TCU-0 kernel: [cf83ddc0] [00009751] 0x9751 (unreliable)
May  7 16:40:34.322086 warn TCU-0 kernel: [cf83ddd0] [c00469ac] do_syslog+0x198/0x424
May  7 16:40:34.322086 warn TCU-0 kernel: [cf83de30] [c0149574] kmsg_read+0x58/0x68
May  7 16:40:34.322086 warn TCU-0 kernel: [cf83de40] [c013f4c8] proc_reg_read+0x90/0xa8
May  7 16:40:34.322086 warn TCU-0 kernel: [cf83de70] [c00f4cb0] do_loop_readv_writev+0x48/0x84
May  7 16:40:34.322086 warn TCU-0 kernel: [cf83dea0] [c00f5870] do_readv_writev+0xcc/0x19c
May  7 16:40:34.322086 warn TCU-0 kernel: [cf83df10] [c00f5c54] sys_readv+0x50/0xfc
May  7 16:40:34.322086 warn TCU-0 kernel: [cf83df40] [c00100d8] ret_from_syscall+0x0/0x4
May  7 16:40:34.322086 warn TCU-0 kernel: --- Exception: c01 at 0xfcad5a8

ret_from_syscall 符号将出现在特定于体系结构的汇编代码中(并非所有体系结构都存在)。我会查看 arch/XXX/kernel/entry.S

它实际上不是一个函数。它是处理从 user-space 到 kernel-space 的系统调用转换的汇编代码的一部分。它只是一个标签,当控制returned 到用户space 时,(汇编)代码的其他部分可以分支到该标签。它几乎肯定对应于紧接在 call(*) 指令之后的地址,该指令在正常系统调用执行路径中调用系统调用特定例程。在这种情况下,调用的系统调用是 readv(2)

通常,执行到达此符号不是通过直接分支指令,而是作为 return-from-subroutine 指令的结果。例外情况是指定了非法的系统调用号或类似的东西。

(* 调用指令具有不同的助记符和行为细节,具体取决于体系结构。它可能是跳转到子程序或分支和-link 或类似的东西。)