I'm not a huge Systems guy, wanted to get more into it post-graduate but never did (I fell in love with money and my post-graduate career kind of fizzled). Anyways...
monolithic kernels have their place, but I tend to disagree with Linus. Me thinks that his arguments are based more on bias on his beloved Linux than on actualities. True, monolithics have their speed but monolithic kernels have their profound issue: if the kernel goes, so does just about everything else. I like the idea of message passing because it removes fault capacity out of the kernel. Suppose you have a bad driver, a well-designed microkernel can easily kill a user process when it fails.
To me, this is why Singularity (Microsoft Research) is such an interesting project. It takes the concept of type safety and language safety and incorporates it into an Operating System. It then goes above it and it ensures that each user process has sufficient knowledge of itself and the messages it passes to the kernel.
However, to me, an even more efficient kernel is the exokernel
. I'm not too thrilled about high levels of abstractions and I'm not too thrilled about message passing either. I think that the kernel should be kept simple in that its only job is to divvy out resources, the rest is up to the application code. Truthfully, most modern OS' are actually hybrid's and are implemented with both micro and monolithic kernels in mind. I think that we need to break away from this and move to a more exokernel structure.