在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看到中断向量布局。 trap_init()函数是设置entry_32.S定义的陷阱处理程序的函数:

set_system_trap_gate(SYSCALL_VECTOR, &system_call);

对于64位内核 ,出于性能原因使用新的SYSENTER (Intel)或SYSCALL (AMD)指令。 arch/x86/kernel/cpu/common.csyscall_init()函数设置了entry_64.S定义的“handler”,并带有相同的名称( system_call )。

对于用户空间的持久性,您可能需要查看此页面 (函数/文件名有点过时)。

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

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

正如您所提到的,系统调用在sys_call_table:下的entry.S中指定,并且它们都以“sys”前缀开头。

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

通常使用lxr(如上面的注释已经提到的)来浏览源代码。

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

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

无论如何,如果我的问题是正确的,那么你不是在寻找一个实现,而是一个实际的呼叫。 GNU libc对我来说太复杂了,但您可以尝试浏览dietlibc源代码。 一些例子:

chdir.S

syscalls.h