Intro

Linux is a monolithic kernel with loadable modules: scheduling, virtual memory, filesystems, networking, and most device drivers execute in one privileged address space. User programs cross that boundary through system calls. The interfaces look separate—files, sockets, processes—but the implementation shares memory management, wait queues, interrupts, and the virtual filesystem.

The visual is a learning route, not an exact kernel-boundary diagram. Real operations cross several subsystems. Reading a file, for example, resolves a path through the VFS, checks permissions, consults the page cache, may ask a filesystem for blocks, and may wait for a storage driver and device interrupt.

Five subsystem routes

RouteInput and outputObservable failure
Process and schedulerRunnable threads become CPU timeStarvation, priority inversion, excessive context switching
Virtual memoryVirtual addresses become page mappings and physical framesPage fault, out-of-memory kill, swap or storage latency
VFS and storagePath and file descriptor operations become cached or device I/OEACCES, ENOENT, filesystem error, blocked I/O
Network stackSocket operations become protocol packets and device queuesTimeout, reset, dropped packet, exhausted buffers
Device model and driversGeneric kernel operations become device-specific commandsDriver error, interrupt storm, unavailable hardware

The system-call boundary is the useful debugging anchor. strace reveals calls and error codes; /proc/<pid> exposes process state; journalctl -k shows kernel messages; perf attributes CPU samples across user and kernel code. Start from the failed boundary, then follow the owning subsystem rather than treating “Linux” as one opaque layer.

Related mechanisms are expanded in Processes and Threads, Memory Management, Linux File Permissions, and Network Data Path.

References