【发布时间】:2015-07-08 17:02:37
【问题描述】:
我正在尝试构建一个关于 Linux 内核和用户空间中的工作方式的“大图”,但我很困惑。 我知道用户空间利用系统调用与内核“对话”,但我不知道如何。我尝试阅读 C 库和内核源代码,但它们很复杂且不易理解。我还阅读了几本有关操作系统概念性事实的书籍,例如管理进程、内存、设备,但它们并没有使“转换”(用户空间->内核)清晰。 那么,用户空间和内核空间之间的转换究竟发生在哪里呢? C 库如何运行机器中运行的 Linux 内核中的代码?
打个比方:想象有一座房子。房子上锁了。打开房子的钥匙就在房子里面。屋子里只有一个人,内核。用户空间是试图进入房屋的人。我的问题是:内核如何知道屋外有人想要钥匙,以及哪种机制允许用该钥匙打开房屋?
【问题讨论】:
-
他们使用门铃。这个问题取决于平台。在
x86-64上,内核设置处理器将syscalls 分派给内核。syscall是一个汇编指令,在类比中充当门铃。 -
“内核设置处理器以向内核分派系统调用”是什么意思?
-
一般来说,内核通过将值写入特定寄存器和内存位置来配置处理器。一旦内核在启动时加载,这是合理的。处理器使用此信息来处理
syscall指令和许多其他内核预期的东西。 -
一个related question on *syscalls and the 'C' library。你也可以看看somesource。根据下面的答案,调用将不是纯“C”,但至少需要一些编译器扩展或汇编程序。 细节是“平台相关的”,但用户空间和内核之间的访问保护必须提供
syscall类似物。
标签: c linux-kernel system-calls userspace