/dev/zero
/dev/zero はどういった経緯で考え出されたのだろう。FreeBSD の man によると 4.4 BSD かららしい。BSD が起源なのだろうか。/usr/share/misc/bsd-family-tree によると 4.4BSD は1993年。割りと新しい。今では Solaris, Linux にもあることを考えると、それほど有用性が明らかなデバイスなのだろうか。
ソースは /usr/src/sys/dev/null/null.c のようだ。
static int zero_read(struct cdev *dev __unused, struct uio *uio, int flags __unused) { int error = 0; while (uio->uio_resid > 0 && error == 0) error = uiomove(zbuf, MIN(uio->uio_resid, PAGE_SIZE), uio); return (error); }
zbuf は M_ZERO つきで malloc(カーネル用)されているから、ゼロで初期化されていて、これを書き込んでいるのだろうか。
man には uiomove の引数の意味が書いていないのでよくわからない。
zbuf = (void *)malloc(PAGE_SIZE, M_TEMP, M_WAITOK | M_ZERO);