Skip to content

Device Drivers in Linux

Content from KnownSec404Team(Medium) and Vivek Gite.

Drivers are used to help the hardware devices interact with the operating system. In windows, all the devices and drivers are grouped together in a single console called device manager. In Linux, even the hardware devices are treated like ordinary files, which makes it easier for the software to interact with the device drivers. When a device is connected to the system, a device file is created in /dev directory.

Most Common types of devices in Linux:

  1. Character devices – These devices transmit the data character by characters, like a mouse or a keyboard.
  2. Block devices – These devices transfer unit of data storage called a block, USB drives, hard drives, and CD ROMs

Executing the following commands displays indications of type of device files :

ls -l /dev

A sample output is :

crw-rw-rw-   1 root tty         5,     2 Oct  2 17:43 ptmx
drwxr-xr-x   2 root root               0 Oct  2 08:05 pts
crw-rw-rw-   1 root root        1,     8 Oct  2 08:05 random
crw-rw-r--+  1 root root       10,   242 Oct  2 08:05 rfkill
lrwxrwxrwx   1 root root               4 Oct  2 08:05 rtc -> rtc0
crw-------   1 root root      248,     0 Oct  2 08:05 rtc0
brw-rw----   1 root disk        8,     0 Oct  2 08:05 sda
brw-rw----   1 root disk        8,     1 Oct  2 08:05 sda1
brw-rw----   1 root disk        8,     2 Oct  2 17:43 sda2
crw-rw----   1 root disk       21,     0 Oct  2 08:05 sg0
drwxrwxrwt   2 root root              40 Oct  2 17:39 shm
crw-------   1 root root       10,   231 Oct  2 08:05 snapshot
drwxr-xr-x   3 root root             340 Oct  2 08:05 snd
lrwxrwxrwx   1 root root              15 Oct  2 08:05 stderr -> /proc/self/fd/2
lrwxrwxrwx   1 root root              15 Oct  2 08:05 stdin -> /proc/self/fd/0
lrwxrwxrwx   1 root root              15 Oct  2 08:05 stdout -> /proc/self/fd/1

Some important commands to remember are :

  1. fdisk : format disk
  2. sfdisk : script oriented tool for partition maanagement
  3. parted : paritions manager
  4. df : detail filesystem
  5. lsblk : list block devices
  6. lsmod : list modules
  7. insmod : insert module
  8. rmmod : remove module

Developing a device driver

All the development is done using C or C++. Required header files are :

#include <linux/init.h>
#include <linux/module.h>

Required functions are an "init" function and an "exit" function. They are to be registered using module_init(init_func) and module_exit(exit_func).

A sample program would look like :

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("AGPL");
MODULE_AUTHOR("NA");

int init_func(void)
{
    printk(KERN_INFO "Hello");
    return 0;
}

void exit_func(void)
{
    printk(KERN_INFO "Goodbye");
}

module_init(init_func);
module_exit(exit_func);

Compiling module in current directory :

make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

Loading module occurs through insmod your_module.ko. Messages from each module is visible in /var/log/message.

To load at kernel boot the following steps need to be observed :

  1. mkdir -p /lib/modules/$(uname -r)/kernel/drivers/<your_module>
  2. cp your_module.ko /lib/modules/$(uname -r)/kernel/drivers/<your_module>/
  3. Edit /etc/modules add the module name to it.
  4. Reload and verify by running lsmod or cat /proc/modules.

Powered by VitePress