The Linux OS has quite a lot of different devices, for easy to understand, this article will only cover the char devices such as how write and load a driver for them. Here I assume you are using Linux Kernel 2.6.x.
End-user programs, like the Linux shell or other GUI based applications are part of the user space. Obviously, these applications need to interact with the system’s hardware. However, they don’t do so directly, but through the kernel supported functions.
What is Kernel Space?
Linux OS manages the machine’s hardware in an efficient manner, offering the user a simple and uniform programming interface. In the same way, the kernel, and in particular its device drivers form a bridge or interface between the end-user/programmer and the hardware. Any subroutines or functions forming part of the kernel (modules and device drivers, for example) are considered to be part of kernel space.