Some ideas on navigating and understanding the Hurd source code.

First you must understand Mach IPC and MiG.  Pay special attention to
the way that various kinds of MiG calls manage memory; this is crucial
to avoid leaks.  The "Mach server writers' guide" explains all this.

Most programs that make up the Hurd are built out of libraries; a
solid understanding of the libraries that make up the source is
essential.  First start by reading the libports library specification
(in libports/ports.h).  This library manages the Mach ports that
servers handle.

Then start looking at some Hurd interfaces.  A good place to start is
to look at the proc server.  There is only one proc server in a
running system, but examine the way the interface (hurd/process.defs)
is written and the way the proc server implements it.

Then look at the auth server; make sure you understand how an auth
transaction works.  Again, by looking at the implementation, you can
see a simple example.

Filesystems are more complex; the interface specification is in
hurd/io.defs and hurd/fs.defs.  These interfaces are implemented by
three different libraries: trivfs, diskfs, and netfs.  trivfs
implements single-node filesystems (that thus have no directories).
Most trivfs filesystems don't even do any filesystem stuff at all.
See, for example, the null translator (trans/null.c) for a simple
example of using trivfs.  

diskfs is used for disk-based filesystems, with one in existence now:
ext2fs.  If you write another diskfs-based filesystem, you
should DEFINITELY imitate the algorithms found in ext2fs; this
is crucial to getting locking right.

netfs is used for nfs and other such things: with directories, and all
the actual filesystem operations being done by some other program (not
necessarily over a network).  The nfs implementation is fairly easy to
understand.

Examine some translators in the trans directory to see various simple
examples.  

Also very important is to acquire familiarity with the Hurd and Mach
calls provided in the GNU C library.  Look at the header files in libc
to see what they are, and read through them.  Also examine parts of
the libc implementation whenever you have any doubt about what an
interface call should do: find where the C library uses that call, and
that should help.  It's worth, in fact, spending some time just
exploring the implementation of various things in the hurd C library.

You should take a look at all the libraries in the Hurd; spend time
reading the code.  Feel free to ask questions to help understand what
you read.
