From Tanenbaum's Modern OS,
every operating system has an I/O subsystem for managing its I/O devices. Some of the I/O software is device independent, that is, applies to many or all I/O devices equally well. Other parts of it, such as device drivers, are specific to particular I/O devices.
There is also a diagram of the layers of the I/O software systems:
In the following two diagrams of Linux's IO subsystem, can you draw a boundary between device-independent and device-dependent components? In other wards, which components are device-dependent, and which components are device-independent? My thought is "drivers" are device-dependent, and "VFS" is device-independent. But I am not sure about the other components.
From the same book:
Bovet's Understanding the Linux Kernel 2005 also has one: