Basically, input/output software organized in the following four layers:
In every input/output software, each of the above given four layer has a well-defined function to perform and a well-defined interface to the adjacent layers.
The figure given below shows all the layers along with hardware of the input/output software system.
Here is another figure shows all the layers of the input/output software system along with their principal functions.
Now let's describe briefly, all the four input/output software layers that are listed above.
Whenever the interrupt occurs, then the interrupt procedure does whatever it has to in order to handle the interrupt.
Basically, device drivers is a device-specific code just for controlling the input/output device that are attached to the computer system.
In some of the input/output software is device specific, and other parts of that input/output software are device-independent.
The exact boundary between the device-independent software and drivers is device dependent, just because of that some functions that could be done in a device-independent way sometime be done in the drivers, for efficiency or any other reasons.
Here are the list of some functions that are done in the device-independent software:
Generally most of the input/output software is within the operating system (OS), and some small part of that input/output software consists of libraries that are linked with the user programs and even whole programs running outside the kernel.