Adding device drivers
A device driver is a program that manages the system's interaction with a piece of hardware. The driver translates between the hardware commands understood by the device and the stylized programming interface used by the kernel. The existence of the driver layer helps keep Linux reasonably device independent.
Device drivers are part of the kernel; they are not user processes. However, a driver can be accessed both from within the kernel and from user space. User-level access to devices is usually provided through special device files that live in the /dev directory. The kernel transforms operations on these files into calls to the code of the driver.
The PC platform has been a source of chaos in the system administrator's world. A dizzying array of hardware and "standards" with varying levels of operating system support are available. Behold:
Over 30 different SCSI chipsets are supported by Linux, and each is packaged and sold by at least twice that many vendors.
Over 200 different network interfaces are out there, each being marketed by several different vendors under different names.
Newer, better, cheaper types of hardware are being developed all the time. Each will require a device driver in order to work with your Linux of choice.
With the remarkable pace at which new hardware is being developed, it is practically impossible to keep the mainline OS distributions up to date with the latest hardware. It is not at all uncommon to have to add a device driver to your kernel to support a new piece of hardware.
Only device drivers designed for use with Linux (and usually, a specific version of the Linux kernel) can be successfully installed on a Linux system. Drivers for other operating systems (like Windows) will not work, so you will need to purchase new hardware with this in mind. In addition, devices vary in their degree of compatibility and functionality when used with Linux, so it's wise to pay some attention to the results other sites have obtained with any hardware you are considering.
Vendors are becoming more aware of the Linux market, and they even provide Linux drivers on occasion. You may be lucky and find that your vendor will furnish you with both drivers and installation instructions. More likely, you will only find the driver you need on some uncommented web page. In either case, this section shows you what is really going on when you add a device driver.
Device numbers
Many devices have a corresponding file in /dev, the notable exceptions on modern operating systems being network devices. By virtue of being device files, the files in /dev each have a major and minor device number associated with them. The kernel uses these numbers to map references to a device file to the corresponding driver.
The major device number identifies the driver with which the file is associated (in other words, the type of device). The minor device number usually identifies which particular instance of a given device type is to be addressed. The minor device number is sometimes called the unit number.
You can see the major and minor number of a device file with ls -l:
% ls -l /dev/sda brw-rw---- 1 root disk 8, 0 Mar 3 1999 /dev/sda
This example shows the first SCSI disk on a Linux system. It has a major number of 8 and a minor number of 0.
The minor device number is sometimes used by the driver to select the particular characteristic of a device. For example, a single tape drive can have several files in /dev representing it in various configurations of recording density and rewind characteristics. In essence, the driver is free to interpret the minor device number in whatever way it wants. Look up the man page for the driver to determine what convention it's using.
There are actually two types of device files: block device files and character device files. A block device is read or written one block (a group of bytes, usually a multiple of 512) at a time; a character device can be read or written one byte at a time. Some devices support access through both block and character device files, although this is extremely rare under Linux.
It is sometimes convenient to implement an abstraction as a device driver even when it controls no actual device. Such phantom devices are known as pseudo-devices. For example, a user who logs in over the network is assigned a PTY (pseudo-TTY) that looks, feels, and smells like a serial port from the perspective of high-level software. This trick allows programs written in the days when everyone used a TTY to continue to function in the world of windows and networks.
When a program performs an operation on a device file, the kernel automatically catches the reference, looks up the appropriate function name in a table, and transfers control to it. To perform an unusual operation that doesn't have a direct analog in the filesystem model (for example, ejecting a floppy disk), a program can use the ioctl system call to pass a message directly from user space into the driver.