我目前正在学习操作系统,使用陷阱来促进Linux内核中的系统调用。我已经在traps.c中找到了陷阱的表,并在entry.S中实现了许多陷阱。
但是,我被指示在Linux内核中找到两个系统调用的实现,这些调用利用陷阱来实现系统调用。虽然我可以找到陷阱本身的定义,但我不知道内核中对其中一个陷阱的“调用”会是什么样子。因此,我很难找到这种行为的一个例子。
在任何人问起之前,是的,这是家庭作业。
值得注意的是,由于kernel.org已关闭:https://github.com/torvalds/linux/,所以我正在使用Github浏览内核源代码。
发布于 2011-09-13 22:44:44
对于x86体系结构,SYCALL_VECTOR (0x80)中断仅用于32位内核。您可以在arch/x86/include/asm/irq_vectors.h中看到中断向量布局。trap_init()函数来自traps.c,它设置在entry_32.S中定义的陷阱处理程序:
set_system_trap_gate(SYSCALL_VECTOR, &system_call);
对于64位内核,新的SYSENTER (英特尔)或SYSCALL (AMD)导入是出于性能原因。来自syscall_init()的arch/x86/kernel/cpu/common.c函数设置了在entry_64.S中定义并具有相同名称(system_call)的“处理程序”。
对于用户空间perspetive,您可能想看看此页 (函数/文件名有点过时)。
发布于 2011-09-13 21:31:24
我被指示在Linux内核中找到两个系统调用的实现,它利用陷阱来实现系统调用
每个系统调用都使用一个陷阱(如果我记得正确的话,可以中断0x80 ),因此PSW中的“内核”位将被打开,并且特权操作将提供给处理器。
正如您所提到的,系统调用是在entry.S中在sys_call_table:下指定的,它们都以"sys“前缀开头。
您可以在: include/linux/syscalls.h中找到系统调用函数头,您可以在这里找到它:http://lxr.linux.no/#linux+v3.0.4/include/linux/syscalls.h
通常使用lxr (正如上面的注释所提到的那样)来浏览源代码。
无论如何,该函数是使用宏的SYSCALL_DEFINE1或othe版本实现的,请参阅http://lxr.linux.no/#linux+v3.0.4/kernel/sys.c。
发布于 2011-09-13 22:02:11
如果您要查找的是实际的系统调用,而不是系统调用的实现,那么可能需要检查一些C库。为什么内核会包括一个系统调用?(我说的不是系统调用实现,而是实际的chdir调用。有一个chdir系统调用,它是一个更改目录的请求,还有一个chdir系统调用实现,它实际上改变了它,并且必须位于内核的某个位置)。好吧,也许一些内核也包含了一些系统,但这是另一个故事:)
无论如何,如果我正确地回答了你的问题,你不是在寻找一个实现,而是一个实际的调用。GNU libc对我来说太复杂了,但是您可以尝试浏览dietlibc源代码。下面是一些例子:
chdir.S
syscalls.h
https://stackoverflow.com/questions/7407652
复制相似问题