Linux kernel is both a monolithic kernel and a modular kernel :) Those things are not mutually exclusive.
Monolithic kernel refers to a kernel all parts of which share a common address space:
This reduces the amount of context switches and messaging involved,
making the concept faster than a Microkernel. On the downside, the
amount of code running in kernel space makes the kernel more prone to
The opposite of "monolithic kernel" is "microkernel", where the kernel is only responsible for coordinating services running in user space which do all the actual job.
"Modular kernel" means that
some part of the system core will be located in independent files
called modules that can be added to the system at run time. Depending
on the content of those modules, the goal can vary such as:
- only loading drivers if a device is actually found
- only load a filesystem if it gets actually requested
- only load the code for a specific (scheduling/security/whatever) policy when it should be evaluated
Those modules are still running in the kernel space and not in user space, so the kernel architecture is still monolithic.