C 应用程序代码如何与内核通信;s代码?

C 应用程序代码如何与内核通信;s代码?,c,linux,unix,linux-kernel,operating-system,C,Linux,Unix,Linux Kernel,Operating System,让我烦恼的是,我在任何地方都找不到关于这个问题的解释,所以我知道: 软件应用程序在执行时加载到内存中 应用程序将使用内核的系统调用,例如分配内存 如果软件应用程序被转换成二进制,内核也被转换成二进制,两者都在内存中,那么它们如何在底层相互通信 在我的知识中肯定有很多空白,所以我可以假设应用程序是编译成内核可以理解的代码,而不是直接转换成机器代码。任何有足够知识来解释这一点的人?详细信息在很大程度上取决于您所询问的特定操作系统和体系结构,但是,一般来说,用户空间应用程序可以通过执行导致CPU中断的

让我烦恼的是,我在任何地方都找不到关于这个问题的解释,所以我知道:

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


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

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

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


在大多数情况下,进行系统调用的代码存储在一个特殊的数据页中,该数据页由内核映射到内存顶部附近。此页面包含可由libc调用的优化代码。(因此,您的代码永远不需要直接调用内核-这都是由包装系统调用的libc函数来处理的,如
read()
write()
)有关更多信息,请参阅。

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

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


在大多数情况下,进行系统调用的代码存储在一个特殊的数据页中,该数据页由内核映射到内存顶部附近。此页面包含可由libc调用的优化代码。(因此,您的代码永远不需要直接调用内核-这都是由libc函数处理的,libc函数包装系统调用,如
read()
write()
)有关更多信息,请参阅。

解释得很好,非常感谢。因此,CPU根据将控制权转移到内核的中断负责,内核将查找包含请求的系统调用的指定空间,该系统调用将映射到正确的函数。解释得很好,非常感谢。因此,CPU根据将控制权转移到内核的中断负责,内核将查找包含请求的系统调用的指定空间,该系统调用将映射到正确的函数。