In short: initrd is old, wastes memory, gets cached (which is another waste of memory,) and needs to be located with a kernel command argument. initramfs is new, and is cache, makes much better use of memory, and can either be loaded the same way as an initrd (through the
root=kernel argument) or compiled straight into the kernel. initrd is of fixed size, which you must calculate before you create it, and then are limited to while it's running. initramfs will grow and shrink as it needs to.
[3/15/07 Nota Bene:] The kernel treats an initrd like any other disk at startup. It tries to execute
/sbin/init(or whatever you specify in the
init=kernel argument,) which may be symbolic links. You also have to specify
root=/dev/ram0to tell it where to find the image. Under initramfs, you may omit the
root=argument, and the kernel only looks for
/init, which may not be a symlink. It's either what you want to run, or a hard link to it. (I use a hardlink to