There is a wide variety of PC hardware components. To use this hardware properly, you need a “driver” with which the operating system (in Linux, the “kernel”), can access this hardware. There are basically two ways of integrating drivers into your system:
The drivers can be compiled directly into the kernel. Such a kernel (“in one piece”) is referred to as a monolithic kernel. Some drivers are only available in this form.
Drivers can be loaded into the kernel on demand. In this case, the kernel is referred to as a modularized kernel. This has the advantage that only those drivers really needed are loaded and the kernel thus contains nothing unnecessary.
Which drivers to compile into the kernel and which to load as run-time modules is defined in the kernel configuration. Basically, components not required for booting the system should be built as modules. This makes sure the kernel does not become too big to be loaded by the BIOS or a boot loader. Drivers for ext2, the SCSI drivers on a SCSI-based system, and similar drivers should be compiled into the kernel. In contrast, items, such as isofs, msdos, or sound, which are not needed for starting your computer system, should definitely be built as modules.
Kernel modules are located in /lib/modules/<version>. Version stands for the current kernel version.