2011-07-27 208 views
19

Asumo la CPU tiene acceso directo a la BIOS y la memoria RAM de la placa base. (Corríjanme si me equivoco)¿Cómo se comunica la CPU con los periféricos?

Pero ¿Cómo se comunica con la CPU otros equipos como los discos duros, tarjetas de expansión, periféricos, etc. otros BIOS?

Conozco el sistema operativo y sus controladores, pero son software, están en la memoria RAM. ¿Cómo se comunica la CPU con todo este hardware en el nivel de hardware? ¿No está limitado solo al BIOS y la RAM de la placa base?

Respuesta

31

En las arquitecturas antiguas, se accedía a los periféricos a través de un mecanismo separado para acceder a la memoria con instrucciones especiales de E/S. En x86, había (¡y todavía hay!) Instrucciones de "entrada" y "salida" para transferir bytes entre la CPU y un periférico. Los periféricos recibieron direcciones, por ejemplo 0x80 para el teclado. Simplificar mucho, haciendo "en 0x80" leería un byte desde el controlador del teclado al registro de la CPU "AL".

En las arquitecturas modernas, se accede a los periféricos de forma similar a la memoria: a través de direcciones de memoria asignadas en un bus. No debe pensar en un autobús como una forma de acceder a la memoria. Es más una forma de abordar periféricos individuales, de los cuales la memoria (RAM/DDR) es solo un tipo. Por ejemplo, puede tener 2 GB de RAM en las direcciones 0x00000000..0x7fffffff. Después de eso, es posible que tenga una tarjeta gráfica en 0x80000000..0x80001fff. El controlador de bus (PCIe o lo que sea) sabe qué rangos de direcciones van a qué periféricos.

La memoria es generalmente especial ya que se puede almacenar en caché, por lo que las lecturas/escrituras individuales en la memoria tienden a no traducirse directamente a lecturas/escrituras individuales en los chips de RAM. Los periféricos están marcados como especiales: los accesos a la CPU deben ir al periférico exactamente como está escrito en su programa.

El idioma con el que hablas con los periféricos es bastante ad hoc según el dispositivo. El tema general es que el periférico se mapea en algún lugar de la memoria (por ejemplo, 0x80000000 para unas pocas KB como arriba), con un bit de estado y acciones individuales controladas por palabras diferentes (por lo general, 32 o 64 bits). Un ejemplo de un mítico puerto serie en 0x80000000:

  • escribir 32 bit de la palabra 'A' a 0x80000000, haciendo cola carácter 'A' en su salida FIFO.
  • Escriba la palabra de 32 bits 0x1 a 0x80000004, que le indica al puerto serie que envíe su cola.

Una vez más, totalmente inventado solo por poner un ejemplo, pero un puerto serie real (uart) no es tan diferente.

El problema es que en realidad no va a ver cualquiera de la disposición de memoria anterior en un sistema operativo moderno, debido a la memoria virtual. Las direcciones anteriores se denominarán "direcciones de memoria física" (o direcciones de bus): las direcciones reales que salen al bus. En cambio, la CPU ve direcciones de memoria virtual. Los periféricos individuales deberán asignarse al espacio de direcciones virtuales. Esto es algo complicado de explicar y probablemente sea mejor en otra Pregunta, pero el punto es que es poco probable que accedas a un periférico por su dirección física real en un sistema operativo moderno.

+4

Esta es una excelente respuesta. ¿Qué tipo de libros crees que podrían ser un poco más amplios y/o más profundos sobre este tema? – Lavya

+2

@JohnRipley Sí, estoy de acuerdo con Lavya. Por favor, recomiéndenos algunas buenas fuentes en las que ha aprendido estos señor. – Utku

+0

Muchas gracias. No estoy trabajando en el nivel kernel en este momento, pero estoy interesado en una cosa. Si hablamos de la arquitectura i386 más popular. No recuerdo nada especial en la información de segmentos de formato de GDTR, LDTR, que se relaciona con cosas como "mapear este segmento o páginas en la memoria de este dispositivo" ... Parece que debería configurarse hablando con un controlador de memoria con comandos especiales para configurarlo? – bruziuz

0

Eso depende de lo que quiere decir con "acceso directo". Un núcleo de CPU se comunica con la memoria principal (RAM) en un bus. (El núcleo puede tener un acceso más directo a cantidades relativamente pequeñas de memoria (caché o registros), pero ese es un problema diferente.) La CPU también se comunica con los periféricos a través de los buses. Algunos tipos de buses de los que quizás haya oído hablar son bus en serie universal (USB, típicamente para dispositivos externos), PCI, bus frontal (un tipo de bus que conecta núcleos de CPU y memoria principal) o Serial-ATA (SATA; para dispositivos como discos duros).

ETA: Mencioné en mi comentario a continuación que los controladores de dispositivos manejan la comunicación a nivel de hardware entre la CPU y el periférico. La mecánica real de la comunicación puede implicar el uso de porciones específicas del espacio de direcciones para transferir datos (memory-mapped I/O), por lo que leer o escribir físicamente en un dispositivo parece acceder a la memoria común. El controlador del dispositivo también trata de cómo una CPU responderá a interrupts desde un dispositivo.

+0

Pero, ¿qué hace que use un bus, p. PCI? ¿Hay alguna instrucción especial de ensamblaje que haga que la CPU use el bus exactamente PCI? – DrStrangeLove

+0

Los autobuses están bastante definidos. En una PC típica, la CPU se comunicará con los distintos buses a través de un [chipset] (http://en.wikipedia.org/wiki/Chipset), utilizando un software [controlador de dispositivo] (http: //en.wikipedia. org/wiki/Device_driver) para controlar el hardware. –

-4

La CPU se comunica con los periféricos (dispositivos de E/S) con la ayuda de cables. Como todos los dispositivos de entrada/salida están conectados a la CPU con la ayuda de cables, estos cables ayudan en la comunicación entre la CPU y los dispositivos periféricos.

Pero ahora los dispositivos inalámbricos se habían lanzado debido a lo cual no es correcto decir que todos los periféricos se comunican con la CPU con la ayuda de cables.

Cuestiones relacionadas