Monolithic kernels run all operating system functions in kernel mode. The kernel itself either contains all necessary code already (compile time extension) or modules can be loaded dynamically (e.g. linux). All kernel code has the same criticality: a bug and the kernel crashes! Performance is good because internal calls are simple procedure calls and not system calls with traps. Maintenance is bad because of millions of lines of code for the kernel with dependencies and no protection between.
Device drivers turn out to be a special weakness of this concept. They contain up to 70% of all kernel code but are written by non-kernel experts in many cases. They have access to all kernel structures and functions which are shared in monolithic kernels.