Linux Kernel Architecture Overview
内核不是运行的代码,而是一堆躺在内存中等待被调用的代码。
内核就是一个由 interrupt 驱动的程序。这个 interrupt 可以是一个系统调用(x86 下,很多 OS 的系统调用是靠 software interrupt 实现的),可以是一个用户程序产生的异常,也可以是一个硬件产生的事件中断。
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。
🗞️ Recent Posts