uire an abstraction layer, without paying the performance penalty paid by microkernels. By allowing for kernel modules, hardware-specific code can often be confined to a module, keeping the core kernel highly portable. Device drivers are a good example of effective use of kernel modules to keep hardware specifics in the modules. 38 April 1999/Vol. 42, No. 4 COMMUNICATIONS OF THE ACM