我们可以思考一下进程何时才能感知到内核的存在。例如,在进行内存分配时,最终需要调用内核的sys_mmap系统调用来申请虚拟内存空间;在创建子进程时,最终需要调用内核的sys_fork来复制父进程;在打开文件时,最终需要调用内核的sys_open来进行文件系统底层操作。这些过程中,我们可以发现一个共同点:它们都需要调用系统调用,而这就是进程与内核交互的本质。
内核本身是一个二进制文件,它是一段代码加上相关的数据,在正常情况下,它会一直驻留在内存中不做任何事情。但是,当进程需要执行某些高特权操作时,就需要调用系统调用,这个过程我们称之为陷入内核。系统调用有一个入口程序,一旦进入系统调用,就开始执行内核代码。等到要执行的高特权操作完成后,系统调用会立即返回,然后进程就可以继续执行。可以看到,内核只在进程需要时出现,然后迅速离开,而进入内核的通道就是系统调用。