【问题标题】:How does an application code talk to the kernel's code?应用程序代码如何与内核代码通信?
【发布时间】:2014-06-28 14:29:18
【问题描述】:

困扰我的是,在我搜索过这个问题的任何地方都没有任何解释,所以这就是我所知道的:

软件应用程序在执行时被加载到内存中 应用程序将使用内核的系统调用,例如分配内存 如果软件应用程序转换为二进制,内核也转换为二进制,两者都在内存中,它们如何在底层相互通信?

我的知识肯定有很多空白,所以我可以假设应用程序被编译为内核可以理解的代码,而不是直接转换为机器代码。有足够知识的人来解释一下吗?

【问题讨论】:

    标签: c linux unix linux-kernel operating-system


    【解决方案1】:

    详细信息在很大程度上取决于您询问的特定操作系统和体系结构,但一般来说,用户空间应用程序可以通过执行一些导致 CPU 中断的特定操作来进行系统调用,从而导致执行跳转到核心。应用程序将在寄存器或堆栈中存储一些数据,这些数据指示所需的系统调用和参数是什么,并且当系统调用完成时,结果会以类似方式传回。

    例如,对于 32 位 x86 Linux 系统,执行系统调用的指定操作是 int 0x80。当应用程序想要执行系统调用时,它会将系统调用的 ID 放在eax 中,并在ebx、ecx、edx、esi、edi 中存储最多六个参数。和ebp(按此顺序)。系统调用完成后,其结果存储在eax。

    在大多数情况下,进行系统调用的代码存储在靠近内存顶部的内核映射的特殊数据页中。此页面包含可被 libc 调用的优化代码。 (因此,您的代码永远不需要直接调用内核——这一切都由包装系统调用的 libc 函数处理,例如 read() 和 write()。)有关更多信息,请参阅 "What are vdso and vsyscall"。

    【讨论】:

    • 解释得很好,非常感谢。因此,CPU 根据将控制权转移到内核的中断来负责,内核将查找包含请求的系统调用的指定空间,这些空间将映射到正确的函数。
    猜你喜欢
    • 2012-10-04
    • 2019-11-09
    • 2013-02-14
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多