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