This document discusses principles of I/O hardware and software. It covers I/O hardware systems, device controllers, synchronous and asynchronous I/O, communication methods between CPUs and devices including special instructions, memory mapping and direct memory access. It also discusses I/O software layers including user libraries, kernel modules and hardware. Device drivers are described as software modules that handle particular devices and encapsulate device-dependent code to implement a standard interface. The document provides examples of block and character devices.