One of the more frustrating aspects of trying to work with the Linux kernel as a developer is the way internal structures and APIs change so quickly. It resembles fashion rather than engineering in this regard. To compound the issue the lack of decent commentary in much of the source code makes matters worse.
For people involved in kernel development day-in day-out it might not be such an issue since they can see changes develop over the longer term, especially if they're following the multiplicity of kernel mailing lists. For people like me who have to dive in occasionally to fix obscure bugs the changes and lack of comments are an immensely frustrating aspect that leads to many wasted hours and unnecessary stress trying to work out what the current fashion is and how it all ties together.
The Linux Kernel is one topic where Google can often be more of a hindrance that a help since so much of the results of searches deal with out-of-date structures and APIs and you can waste more time thinking you've got the right documentation and then discovering inconsistencies.
That said, there are some resources that do help and I'm listing them here to help myself keep track of them since when I store them as bookmarks I tend to loose track of them too.
Of course there is quite a bit of information in the kernel source tree in the Documentation/ directory so it's always worth doing egrep -rn 'search terms' Documentation/*'
Linux Kernel in a Nutshell PDF/XML/printed, by Greg Kroah-Hartman.
If you want to know how to build, configure, and install a custom Linux kernel on your machine, buy this book. It is written by someone who spends every day building, configuring, and installing custom kernels as part of the development process of this fun, collaborative project called Linux.
LKiaN covers version 2.6.18 of the kernel.
Linux Device Drivers, 3rd Edition PDF/XML/printed, by Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman.
This edition contains quite a bit of new material relevant to the 2.6 kernel. The discussion of locking and concurrency has been expanded and moved into its own chapter. The Linux device model, which is new in 2.6, is covered in detail. There are new chapters on the USB bus and the serial driver subsystem; the chapter on PCI has also been enhanced. While the organization of the rest of the book resembles that of the earlier editions, every chapter has been thoroughly updated.
The Linux Kernel Module Programming Guide 2.6 HTML, by Peter Jay Salzman, Michael Burian and Ori Pomerantz.
The Linux Kernel Module Programming Guide was originally written for the 2.2 kernels by Ori Pomerantz. Eventually, Ori no longer had time to maintain the document. After all, the Linux kernel is a fast moving target. Peter Jay Salzman took over maintenance and updated it for the 2.4 kernels. Eventually, Peter no longer had time to follow developments with the 2.6 kernel, so Michael Burian became a co-maintainer to update the document for the 2.6 kernels.
HowTos and Articles
the Linux Cross Reference project
A fantastic resource that indexes the source code of most versions of the linux kernel tree and creates fully linked browseable source that makes it easy to track relationships between variables, structures, functions and macros.
An easy way to build and test gcc/glibc cross-toolchains from scratch.