We give a general characterization of I/O elements and provide a framework for analyzing the potential for zero-copy transfers. Finally, we describe the design, implementation, and performance of a prototype I/O system that uses the above analysis to minimize data copying. Our prototype uses a global buffer cache to allow call-by-reference transfers of buffers between distinct subsystems.