Special thanks to Matthew N. Dodd, Warner Losh, Bill Paul, Doug Rabson, Mike Smith, Peter Wemm and Scott Long.
This chapter explains the Newbus device framework in detail.
A device driver is a software component which provides the interface between the kernel's generic view of a peripheral (e.g. disk, network adapter) and the actual implementation of the peripheral. The device driver interface (DDI) is the defined interface between the kernel and the device driver component.
There used to be days in UNIX®, and thus FreeBSD, in which there were four types of devices defined:
block device drivers
character device drivers
network device drivers
pseudo-device drivers
Block devices performed in a way that used fixed size blocks [of data]. This type of driver depended on the so-called buffer cache, which had cached accessed blocks of data in a dedicated part of memory. Often this buffer cache was based on write-behind, which meant that when data was modified in memory it got synced to disk whenever the system did its periodical disk flushing, thus optimizing writes.
However, in the versions of FreeBSD 4.0 and onward the distinction between block and character devices became non-existent.