los dispositivos de E/S pueden clasificarse en dos categorías: dispositivos de bloques y dispositivos de caracteres. Un dispositivo de bloques es uno que almacena la información en bloques de tamaño fijo, cada uno con su propia dirección. El tamaño de los bloques varía desde 512 bytes a 32768 bytes. La propiedad esencial de un dispositivo de bloques es que es posible leer o escribir cada bloque independientemente de todos los demás. Los discos son los dispositivos de bloques más comunes. Un dispositivo de caracteres proporciona o acepta un flujo de caracteres, sin tener en cuenta ninguna estructura de bloque. No es un dispositivo direccionable y no cuenta con ninguna operación de posicionamiento. Las impresoras, los interfaces de red, los ratones (para señalar en la pantalla), las ratas (para experimentar en el laboratorio de psicología) y la mayoría de los otros dispositivos que no son similares a los discos, pueden ser vistos como dispositivos de caracteres. Las unidades de E/S constan normalmente de un componente mecánico y un componente electrónico. En muchos casos es posible separar las dos partes para tener un diseño más modular y general. El componente electrónico se denomina controlador del dispositivo o adaptador. En los ordenadores personales, este componente suele adoptar la forma de una tarjeta de circuito impreso (tarjeta controladora) que puede insertarse en una ranura de expansión. El componente mecánico es el dispositivo mismo. La tarjeta controladora está provista usualmente de un conector en el cual puede conectarse un cable que va al dispositivo. Muchas controladoras pueden manejar dos, cuatro o incluso ocho dispositivos idénticos. Si la interfaz entre la controladora y el dispositivo es un interfaz estándar, ya sea un estándar ANSI, IEEE o ISO oficial, o un estándar de facto, eso permite que cualquier fabricante de hardware pueda manufacturar controladores o dispositivos que se ajusten a esa interfaz. Por ejemplo, muchas compañías de hardware fabrican unidades de disco compatibles con la interfaz IDE o SCSI. Cada controlador tiene unos cuantos registros que le sirven para comunicarse con la CPU. Escribiendo en estos registros, el sistema operativo puede ordenar al dispositivo que suministre datos, acepte datos, se encienda o apague a sí mismo, o realice alguna otra acción. Leyendo de estos registros, el sistema operativo puede averiguar en qué estado se encuentra el dispositivo, si está preparado o no para aceptar un nuevo comando, etc. Además de los registros de control, muchos dispositivos tienen un búfer de datos que el sistema operativo puede leer y escribir. Por ejemplo, en muchos ordenadores la manera usual de visualizar píxeles en la pantalla es mediante una RAM de vídeo (que es básicamente un búfer de datos) en la que los programas o el sistema operativo pueden escribir. Dicho lo anterior surge la pregunta de cómo se comunica la CPU con los registros de control y los búferes de datos de los dispositivos. Existen dos alternativas. Con el primer enfoque, a cada registro de control se le asigna un número de puerto de E/S, que es un número entero de 8 o 16 bits. Utilizando una instrucción especial de E/S como IN REG,PUERTO la CPU puede leer el registro de control PUERTO y almacenar el resultado en un registro REG de la CPU. Similarmente, con OUT PUERTO,REG la CPU necesita direccionar los controladores de dispositivo para intercambiar datos con ellos. La CPU puede solicitar datos del controlador de E/S byte a byte, pero haciéndolo así estaría desperdiciándose mucho tiempo de CPU. Por ese motivo normalmente se utiliza un esquema diferente, denominado acceso directo a memoria (DMA; Direct Memory Access). El sistema operativo sólo puede utilizar DMA si el hardware dispone de un controlador de DMA, por lo que la mayoría de los sistemas cuentan con él. A veces ese controlador está integrado en los controladores de disco o en otros controladores, pero tal diseño significa tener un controlador de DMA por cada dispositivo. Más comúnmente, se tiene un único controlador de DMA (por ejemplo en la placa madre) para regular las transferencias con múltiples dispositivos, a menudo de forma concurrente.