在下面的调用跟踪中,我们看到了一个名为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
答案 0 :(得分:1)
ret_from_syscall
符号将位于特定于体系结构的汇编代码中(并非所有体系结构都存在)。我会查看arch/XXX/kernel/entry.S
。
它实际上不是一个功能。它是汇编代码的一部分,用于处理从用户空间到系统调用的内核空间的转换。它只是一个标签,当将控件返回给用户空间时,(程序集)代码的其他部分可以分支到该标签。它几乎肯定对应于在call
(*)指令之后紧接在正常系统调用执行路径中调用系统调用特定例程的地址。在这种情况下,调用的系统调用是readv(2)
。
通常,执行不会通过直接分支指令到达此符号,而是作为子程序返回指令的结果。如果指定了非法的系统呼叫号码或类似的情况,则例外。
(*调用指令具有不同的助记符和行为详细信息,具体取决于体系结构。它可能是跳转到子例程或分支链接或类似的东西。)