On Tue, Feb 12, 2013 at 5:34 PM, jordon <[email protected]> wrote:
> Today I was looking into some of the more simple devices to see how they
> are implemented. I figured the basic text ones (zero, random, null,
> etc) would be a nice place to start. I went to /usr/src/sys/dev to look
> for them, but I couldn't find them. Where is the source of these basic
> devices? Are they actual drivers like network drivers or are they some
> completely different devices?
Devices != drivers. Indeed, network drivers generally do not present
devices in /dev/. That was one of the (early) criticisms of the BSD
networking model: it created a new namespace for interface names.
Anyway, if you're looking for the code behind a device file (a block
device or character device file in the filesystem), you start by
looking up its major number in the arrays in the file
/usr/src/sys/arch/${ARCH}/${ARCH}/conf.c. For example, /dev/zero is a
character device with major 2, and
/usr/src/sys/arch/amd64/amd64/conf.c has this:
struct cdevsw cdevsw[] =
{
cdev_cn_init(1,cn), /* 0: virtual console */
cdev_ctty_init(1,ctty), /* 1: controlling terminal */
cdev_mm_init(1,mm), /* 2: /dev/{null,mem,kmem,...} */
...
cdev_mm_init() is a macro in <sys/conf.h>, and if you stare there and
work out the cpp expansion, you'll eventually look for functions
mmopen(), mmclose(), mmrw(), etc. For amd64, those are implemented in
/usr/src/sys/arch/amd64/amd64/mem.c, where the code figures out which
of the minor devices is involved in a given call by examining the
'dev' argument to the function.
Philip Guenther