A kernel is just another program, usually written in C, that accepts user input, processes data, and generates output.
Kernel input/output comes from programs making API calls, devices, and interrupts.
Kernel definition: A program that interfaces with the computer’s hardware and software, abstracting the low-level details of the hardware while managing the sometimes conflicting resource demands of the software.
Developers expect services such as access control, process management, memory management, file management, network services, and device management from a kernel.
Kernel types include monolithic, modular, and microkernel.
Monolithic kernels have all services run in kernel mode in a shared address space, with code pre-linked.
Pros of monolithic kernels include easier implementation, fewer mode switches, but they also have security, stability, and size cons.
Modular kernels are similar to monolithic kernels, with code (drivers) loaded and unloaded after the kernel is running.
Microkernel kernels have the bare minimum in kernel (IPC, device access, basic process & memory management), with all else in user space.
In-memory size of microkernels is kept small by only loading needed code, and they offer some symbol-level isolation.
Pros of microkernels include smaller kernel, stability, flexibility, maintainability, but they also have IPC overhead and dependency on correct user-level process.
Modular design is chosen for Windows, Linux, and MacOS X.
Enforcement in kernels is done through the CPU, which is a fundamental protection mechanism.
Kernel mode is a mode in which the kernel operates.
User mode is a mode in which the user operates.
Switching between kernel and user modes has overhead and is a mode switch.
Both root and kernel have a sense of power.
Kernel can drop to user, but user switching back to kernel is hard.