This book explains all of the details about OS development, covering interprocess communication (race conditions, semaphores, process scheduling) memory management (swapping, paging, associative memory, page replacement algorithms, segmentation), file systems (naming, structures, types, access, memory-mapped files, directory schemes), layering of protocols, client-server models, RPC, group communication, clocks, election, atomic transactions, deadlocks, threads, SMP, distributed file systems, and much much more.
This is an excellent book and is very detailed and well-written. It covers OSes generally as well as giving detailed real-world examples. In particular, it has very extensive case-studies for UNIX, MS-DOS, MACH and Amoeba. In addition, there are many problems set and comparisons drawn between different OSes. There is a small introduction to C in an appendix to facilitate reading some of the examples given in the book, although it should be stressed that emphasis is places on the concepts of operating system design rather than the author taking you through reams of code. There are plenty of diagrams to make things like process flow easier to understand. I found this book invaluable during the Operating Systems part of the Cambridge University Computer Science course.