在我搜索过这个问题的任何地方都没有任何解释让我感到困扰所以这就是我所知道的:
软件应用程序在执行时会加载到内存中 应用程序将使用内核的系统调用,例如分配内存 如果软件应用程序转换为二进制文件,内核也是如此,那么它们在内存中如何相互通信?
我的知识肯定存在很多差距所以我可以假设应用程序被编译为内核可以理解的代码而不是直接转换为机器代码。有足够的知识来解释这个吗?
答案 0 :(得分:6)
细节在很大程度上取决于您询问的特定操作系统和体系结构,但是,通常,用户空间应用程序可以通过执行导致CPU中断的某些特定操作来进行系统调用,从而导致执行跳转到核心。应用程序将在寄存器或堆栈中存储一些数据,指示所需的系统调用和参数,并在系统调用完成时以相似的方式传回结果。
例如,对于32位x86 Linux系统,执行系统调用的指定操作是int 0x80
。当应用程序想要执行系统调用时,它会将系统调用的ID放在eax
中,并在ebx
,ecx
,edx
中存储最多六个参数, esi
,edi
和ebp
(按此顺序)。系统调用完成后,其结果将存储在eax
。
在大多数情况下,进行系统调用的代码存储在靠近内存顶部的内核映射的特殊数据页中。此页面包含可由libc调用的优化代码。 (因此,您的代码永远不需要直接调用内核 - 这全部由包装系统调用的libc函数处理,如read()
和write()
。)有关更多信息,请参阅{{3} }。