操作系统内核设计一直分为两个阵营:微内核和单内核。
单内核是两大阵营中一种较为简单的设计,指的是整个内核从整体上作为一个单独的大过程来实现,并且同时运行在一个单独的地址空间内。所有的内核服务都在这样一个大的内核空间运行,内核之间的通信可以简单地实现的函数调用 。这样的设计具有简单高效的特点。但是,如果使用单内核设计,每次对内核作出修改(比如增加或者删除驱动程序),都必须重新编译源代码,生成新的二进制文件,造成了使用和部署上的麻烦。
微内核并不是作为一个单独的大过程来实现的,相反,内核的功能被划分成为多个独立的过程,每一个过程叫做一个服务器。多个服务器程序都运行在自己的地址空间,只有少量核心的服务器运行在特权模式下,服务器之间的通信采用了进程间通信机制。独立的服务器进程提高了系统的健壮性,但是进程间通信由于涉及内核空间和用户空间的上下文切换,其开销远比函数调用大得多。
Linux采用了实用主义的设计。为了满足性能要求,Linux内核被设计成单内核。但是,Linux内核同时借鉴了微内核的精华:模块化设计以及动态装载内核模块的能力。除了诸如进程切换、内存管理等核心的内核功能,将大部分内核功能作为单独的内核模块设计并实现。这些内核模块编译好后以单独的二进制文件的形式存在,内核在运行过程中,按照需求,动态地加载并链接进入内核空间运行。不使用的模块还可以在运行的过程中动态卸载。这样的设计,既保证了内核的性能,也改进了传统单内核设计的灵活性。