A wonderful quote appears at the start of the book: "Hardware is hard, inflexible, produced by gnomes with sub-micron tools. Virtual machines wrap a layer of software around this hardware, and suddenly computers become flexible, malleable and start doing new tricks: running multiple operating systems, executing several instruction sets, allowing running programs to switch machines, or even rejecting unsafe code."
Many of the "new tricks" of virtualization are thoroughly explored in this book. The authors get "under the hood" of many VMs and go through the details of how they work. Also, they present the many types of virtualization in a well organized, unified framework. The book is also a good history lesson; various forms of virtualization have been around for decades, and the authors go through many case studies to show how many "modern" VM concepts are actually not as modern as you might think.
The first few chapters focus on emulators. They go into great detail about the realities of mapping register sets, memory, interrupts, etc in an emulator, as well as other nits such as how to deal with self-modifying code. Binary-to-binary translation is covered, as well as how the translation can rewrite sections that are hard to virtualize. Dynamic binary optimizers are also covered, as well as how they can profile running code & reorder it to improve locality & speed. The HP Dynamo project is then reviewed to demonstrate the performance gains that are possible using dynamic optimization.
Virtual machines for programming languages are covered next. The typical description of the Java VM is covered here, as well as the Microsoft CLR. However, the section about Pascal P-code from the late 1970's is a nice reminder that the use of VMs for programming languages is not new.
Whole-system VMs are also covered next (e.g. VMWare, Xen...). The discussion builds on the concepts in the early chapters, and describe how memory is mapped, critical instructions are patched & rewritten, system calls are caught, etc. And of course VMWare is one of the case studies.
Finally, I thought one of the more interesting chapters is about "codesigned" VMs; these use low-level 'firmware' (not microcode) running in a minimal processor to effectively emulate another processors instruction set (though at hardware speeds). The processor firmware performs the functions that more complex processors do in silicon, such as instruction reordering, branch prediction, etc. The recent Transmeta Crusoe processor (designed in the late 90's) is reviewed as a recent example of this technique. But another case study -- of the IBM AS/400 designed in the late 80's -- shows that the codesigned VM concept is not new, either.
Overall, this textbook is a nice overview of VMs in multiple forms (that is, for systems, for languages, for emulators, etc). It takes a high-level, computer-science perspective, so it's not product specific. I thought it went into sufficient detail so that it didn't seem too impractical or watered down. My only complaint is that it was a bit wordy in spots, as textbooks sometimes are. But if you're interested in the broad topic of VMs, it'll be a good addition to your library.