在Linux内核源代码中实现系统调用/陷阱



我目前正在学习操作系统使用陷阱来促进Linux内核中的系统调用。我已经在traps.c中找到了陷阱的表,并且在entry.S中找到了许多陷阱的实现。

然而,我被指示在Linux内核中找到两个系统调用的实现,它们利用陷阱来实现系统调用。虽然我可以找到陷阱本身的定义,但我不确定内核中对这些陷阱的"调用"是什么样子的。因此,我正在努力寻找这种行为的例子。

在别人问之前,是的,这是作业。

作为一个注意事项,我使用Github浏览内核源代码,因为kernel.org已经关闭:https://github.com/torvalds/linux/

对于x86架构,SYCALL_VECTOR (0x80)中断仅用于 32位内核。您可以在arch/x86/include/asm/irq_vectors.h中看到中断矢量布局。traps.c中的trap_init()函数是设置entry_32.S中定义的陷阱处理程序的函数:

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

对于64位内核,出于性能原因使用新的SYSENTER (Intel)或SYSCALL (AMD)指令。arch/x86/kernel/cpu/common.c中的syscall_init()函数设置entry_64.S中定义的"处理程序",并具有相同的名称(system_call)。

从用户空间的角度来看,您可能想看看这个页面(对于函数/文件名来说有点过时了)。

我被指示在Linux内核中找到两个系统调用的实现,它们利用陷阱来实现一个系统调用

每个系统调用都使用一个陷阱(中断0x80,如果我没记错的话),因此PSW中的"内核"位将被打开,并且处理器将可以使用特权操作。

正如您提到的,系统调用在条目中指定。sys_call_table:下的S,它们都以"sys"前缀开头

你可以在:include/linux/syscalls.h中找到系统调用函数头文件,你可以在这里找到它:http://lxr.linux.no/+ v3.0.4 linux/include/linux/syscalls.h

一般使用lxr(如上面的注释所述)来浏览源代码。

无论如何,该函数是使用SYSCALL_DEFINE1或其他版本的宏实现的,参见http://lxr.linux.no/linux + v3.0.4/内核/sys.c

如果您正在寻找一个实际的系统调用,而不是一个系统调用的实现,也许您需要检查一些C库。为什么内核要包含系统调用?(我不是在谈论一个系统调用实现,我在谈论例如一个实际的chdir调用。有一个chdir 系统调用,这是一个更改目录的请求,有一个chdir 系统调用实现,它实际上改变了它,必须在内核的某个地方)。好吧,也许有些内核也包含一些系统调用,但那是另一个故事:)

无论如何,如果我没有理解错你的问题,你不是在寻找一个实现,而是一个实际的调用。GNU libc对我来说太复杂了,但是您可以尝试浏览libc的源代码。一些例子:

目录。S

syscalls.h

最新更新