我目前正在学习操作系统使用陷阱来促进Linux内核中的系统调用。我在traps.c中找到了陷阱表,并在entry.S中找到了许多陷阱的实现。
但是,我已经指示在Linux内核中找到两个系统调用的实现,它使用陷阱来实现系统调用。虽然我可以找到陷阱本身的定义,但我不确定内核中的其中一个陷阱的“调用”是什么样的。因此,我很难找到这种行为的例子。
在有人问之前,是的,这是作业。
作为一个注释,我正在使用Github浏览内核源代码,因为kernel.org已关闭: https://github.com/torvalds/linux/
答案 0 :(得分:7)
对于x86架构,SYCALL_VECTOR(0x80)中断仅用于32位内核 。您可以在arch/x86/include/asm/irq_vectors.h
中看到中断向量布局。来自trap_init()
的{{1}}函数是设置traps.c
中定义的陷阱处理程序的函数:
entry_32.S
对于 64位内核,出于性能原因,使用新的 SYSENTER (Intel)或 SYSCALL (AMD)说明。来自set_system_trap_gate(SYSCALL_VECTOR, &system_call);
的{{1}}函数设置了syscall_init()
中定义的“处理程序”并且具有相同的名称( system_call )。
对于用户空间的持久性,您可能需要查看this page(函数/文件名有点过时)。
答案 1 :(得分:0)
我被指示在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
答案 2 :(得分:0)
如果您正在寻找实际的系统调用,而不是系统调用的实现,那么您可能想要检查一些C库。为什么内核会包含系统调用? (我不是在讨论系统调用实现,我在谈论例如实际的chdir
调用。有一个chdir
系统调用< / em>,这是一个更改目录的请求,并且有一个chdir
系统调用实现,它实际上会更改它,并且必须位于内核中的某个位置)。好吧,也许有些内核确实包含了一些系统调用,但这是另一个故事:)
无论如何,如果我的问题是正确的,那么你不是在寻找实施,而是在寻找实际的电话。 GNU libc对我来说太复杂了,但您可以尝试浏览dietlibc源代码。一些例子: