首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux内核源代码中系统调用/陷阱的实现

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

Stack Overflow用户
提问于 2011-09-13 19:54:16
回答 3查看 4.2K关注 0票数 13

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

但是,我被指示在Linux内核中找到两个系统调用的实现,这些调用利用陷阱来实现系统调用。虽然我可以找到陷阱本身的定义,但我不知道内核中对其中一个陷阱的“调用”会是什么样子。因此,我很难找到这种行为的一个例子。

在任何人问起之前,是的,这是家庭作业。

值得注意的是,由于kernel.org已关闭:https://github.com/torvalds/linux/,所以我正在使用Github浏览内核源代码。

EN

回答 3

Stack Overflow用户

发布于 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,您可能想看看此页 (函数/文件名有点过时)。

票数 7
EN

Stack Overflow用户

发布于 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

票数 0
EN

Stack Overflow用户

发布于 2011-09-13 22:02:11

如果您要查找的是实际的系统调用,而不是系统调用的实现,那么可能需要检查一些C库。为什么内核会包括一个系统调用?(我说的不是系统调用实现,而是实际的chdir调用。有一个chdir系统调用,它是一个更改目录的请求,还有一个chdir系统调用实现,它实际上改变了它,并且必须位于内核的某个位置)。好吧,也许一些内核也包含了一些系统,但这是另一个故事:)

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

chdir.S

syscalls.h

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7407652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档