内核不是运行的代码,而是一堆躺在内存中等待被调用的代码。

内核就是一个由 interrupt 驱动的程序。这个 interrupt 可以是一个系统调用(x86 下,很多 OS 的系统调用是靠 software interrupt 实现的),可以是一个用户程序产生的异常,也可以是一个硬件产生的事件中断。

Linux 内核的操作系统是不是得一直运行着? - 知乎

Is kernel a separate running process or just backend for userspace program?

首先要搞清楚的一个问题是,Linux 内核当中分配的内存是全局的吗,换一句话来说,如果一个进程调用了某一个 syscall,在服务这个 syscall 的对应的内核中分配了某一个变量,那么这个变量另一个进程能够访问到吗?

答案是可以的。举个例子,在 KVM 中,如果主线程和 vcpu 线程是不同的线程(在 linux 中进程就是线程),主线程调用了 KVM_CREATE_VCPU 创建了新的 vcpu,执行的过程中 KVM 分配了一个 kvm_vcpu struct 并且初始化了里面的一些值。 然后 fork 出了一个 vcpu 线程,这个 vcpu 线程也可以通过一些 ioctl 来更改 kvm_vcpu 的值,这不正说明了 kvm_vcpu 是任何线程都可以访问的吗?

同时我们知道,每一个进程的页表的映射内核部分的页表是共享的,那么内核态分配的一些变量也因此变得共享了,这是很合理的。

所以我们知道 kernel 不需要是一个 separate 的 process。

当然,我们有内核线程,也就是不存在用户态的进程,内核线程是一个 separate running process。