hardware - son - relacion cpu periferico
¿Cómo se comunica la CPU con los periféricos? (3)
Supongo que la CPU tiene acceso directo al BIOS y la RAM de la placa base (corríjame si me equivoco)
Pero, ¿cómo se comunica la CPU con otro hardware como discos duros, tarjetas de expansión, periféricos, otros BIOS, etc.?
Sé sobre 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 a solo BIOS y RAM de la placa base?
En arquitecturas más 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 aún hay!) Instrucciones "in" y "out" para transferir bytes entre la CPU y un periférico. A los periféricos se les dieron direcciones, por ejemplo 0x80 para el teclado. Simplificando 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 las direcciones de memoria asignadas en un bus. No debes pensar en un autobús como una forma de acceder a la memoria. Es más una forma de direccionar 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érico.
La memoria suele ser especial, ya que se puede almacenar en caché, por lo que las lecturas / escrituras individuales en la memoria tienden a no traducirse directamente a las 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 se habla con los periféricos es bastante ad-hoc según el dispositivo. El tema general es que el periférico se asigna en algún lugar de la memoria (por ejemplo, 0x80000000 para unos pocos KB como anteriormente), con bits de estado individuales y acciones controladas por diferentes palabras (generalmente 32 o 64 bits). Un ejemplo mítico de un puerto serie en 0x80000000:
- Escriba la palabra ''A'' de 32 bits a 0x80000000, poniendo en cola el carácter ''A'' en su salida FIFO.
- Escriba la palabra de 32 bits 0x1 a 0x80000004, que le dice al puerto serie que envíe su cola.
Una vez más, totalmente hecho solo por ejemplo, pero un puerto serie real (uart) no es tan diferente.
El problema es que realmente no verá ninguno de los diseños de memoria anteriores 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 se envían al bus. La CPU en cambio ve direcciones de memoria virtual. Los periféricos individuales deberán asignarse al espacio de direcciones virtuales. Esto es un poco complicado de explicar y probablemente sea mejor en otra pregunta, pero el punto es que es poco probable que acceda a un periférico por su dirección física real en un sistema operativo moderno.
Eso depende de lo que quieras decir con "acceso directo". Un núcleo de CPU se comunica con la memoria principal (RAM) a través de un bus . (El núcleo puede tener acceso más directo a cantidades relativamente pequeñas de memoria (caché o registros), pero eso es un problema diferente). La CPU también se comunica con los periféricos a través de buses. Algunos tipos de buses que puede haber escuchado son: bus 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; a menudo se usa para dispositivos como discos duros).
ETA: Mencioné que en mi comentario a continuación, 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 involucrar el uso de partes específicas del espacio de direcciones para transferir datos ( E / S mapeadas en memoria ), de modo que la lectura o escritura física en un dispositivo se parece al acceso a la memoria ordinaria. El controlador de dispositivo también se ocupa de cómo responderá una CPU a las interrupts de un dispositivo.
La respuesta aceptada es precisa, por supuesto, pero tal vez DrStrangeLove pretendía abordar otra cosa o, al menos, la pregunta responde a otras respuestas. De hecho, cuando alguien pregunta "¿Cómo se comunican los periféricos con la CPU en el nivel de hardware?", Creo que la respuesta debería mencionar el rol de los módulos de E / S (como los adaptadores de E / S que todos conocen). Es importante enfatizar esto porque parte de la lógica requerida para hablar con los dispositivos de E / S está incorporada dentro de los módulos de E / S, lo que disminuye la necesidad de atención de la CPU al realizar operaciones de E / S. Esto me parece relevante en el contexto de la pregunta porque pregunta sobre los aspectos de hardware de las operaciones de E / S, y los adaptadores son piezas de hardware que abstraen las intrinsicacias de los dispositivos de E / S, ocultando sus complejidades de la CPU (y desde el sistema operativo también). Por ejemplo, los adaptadores de disco ocultan los aspectos de la geometría de los discos, liberando a la CPU de ejecutar la lógica necesaria para girar las placas de los discos, ubicar un cilindro y esperar a que el sector correcto pase por debajo de los cabezales de lectura / escritura. Razonamientos similares se aplican a otros dispositivos como adaptadores de video, tarjetas de red, etc. En pocas palabras, sin los módulos de E / S, las tareas de E / S abrumarían la CPU. Para citar Stallings:
Un módulo de E / S funciona para permitir que el procesador vea una amplia gama de dispositivos de una manera sencilla. Existe un espectro de capacidades que pueden proporcionarse. El módulo de E / S puede ocultar los detalles de tiempo, formatos y la electromecánica de un dispositivo externo para que el procesador pueda funcionar en términos de simples comandos de lectura y escritura, y posiblemente comandos de abrir y cerrar archivos. En su forma más simple, el módulo de E / S todavía puede dejar gran parte del trabajo de control de un dispositivo (por ejemplo, rebobinar una cinta) visible para el procesador. Un módulo de E / S que asume la mayor parte de la carga de procesamiento detallada, que presenta una interfaz de alto nivel al procesador, generalmente se conoce como un canal de E / S o procesador de E / S. Un módulo de E / S que es bastante primitivo y requiere un control detallado se suele denominar controlador de E / S o controlador de dispositivo. Los controladores de E / S se ven comúnmente en los microcomputadores, mientras que los canales de E / S se usan en los mainframes.
Además, como John Ripley declaró correctamente, hay un espacio de E / S que se asigna de la misma manera que la memoria RAM. De hecho, los periféricos podrían asignarse directamente al espacio de direcciones de la memoria (que se conoce como MMIO , E / S asignada a la memoria), o en un espacio de dirección separado ( PMIO , E / S asignada al puerto, que también se denomina "I aislado" / O "porque, a diferencia de MMIO, las direcciones de E / S están completamente separadas de las de la RAM de la computadora. Es por eso que tiene que usar las instrucciones de entrada y salida para comunicarse con dispositivos que utilizan PMIO).
Por lo anterior, MMIO y PMIO tratan los dispositivos de E / S como posiciones de memoria, que es la esencia de cómo el hardware se ocupa de las operaciones de E / S, pero vale la pena mencionar aquí algunos detalles adicionales para lograr la gran carga conceptual que implica. I / O. Debido a que cada adaptador tiene un rango de direcciones limitado, debemos entender que tales posiciones de memoria funcionan como buffers de datos, lo que significa que solo tiene unos pocos bytes ("bloques de datos") para comunicarse con el dispositivo a la vez. Por esta razón, es común que la CPU NO use directamente los datos que lee de esas posiciones de memoria: primero, los datos se leen desde el dispositivo de E / S a través de la dirección correspondiente, luego estos datos se almacenan en la RAM y solo entonces la CPU puede usarlo. Para obtener eso, piense en un archivo binario grande que la CPU debe ejecutar: el adaptador de disco tiene un búfer limitado limitado por su espacio de direccionamiento de E / S (tenga en cuenta que no me refiero a los búferes internos del adaptador, sino a su el espacio de direcciones visto por la CPU), por lo que el adaptador lee algunos datos del disco y advierte a la CPU cuando el búfer se llena a través de una interrupción; a continuación, la CPU interrumpe lo que está haciendo, lee el búfer, copia el contenido del búfer en la RAM y le indica al adaptador que puede continuar trayendo más datos del disco. Este ciclo se repite hasta que el archivo binario está completamente cargado en la RAM. A partir de ese momento, la operación de lectura se declara finalizada y el archivo puede ejecutarse finalmente.
Este ciclo se llama E / S controlada por interrupciones y se produce totalmente en el hardware (con algunos sistemas operativos compatibles para manejar las interrupciones), pero tenga en cuenta que existen otras dos opciones para realizar operaciones de E / S. También es posible emplear el llamado PIO (E / S programable) donde, en lugar de usar el mecanismo de interrupción, la CPU agrupa continuamente el controlador a través de un bucle hasta que se reúne toda la información requerida, bloque por bloque (cuando el último bloque se recupera, el bucle termina). Tanto la E / S como el PIO controlados por interrupciones desperdician el tiempo de CPU (especialmente este último) y han sido reemplazados hace mucho tiempo por el Acceso directo a memoria (DMA), que permite que el dispositivo de E / S escriba (o lea) sus datos directamente en (o desde) la memoria RAM según las instrucciones de la CPU. Debido a su naturaleza de agrupación, creo que PIO está completamente implementado en software, pero podría estar equivocado en este punto. Tengo que comentar que, aunque DMA hizo que el PIO y la E / S impulsada por interrupciones no estén actualizados, no estoy seguro de que ambos estén prohibidos en las arquitecturas modernas.