domingo, 5 de septiembre de 2010

Tarjetas madre, chipsets y el mapa de memoria

                           Nota previa:
Este es un trabajo que hace algún  tiempo ya leí y me pareció excelente, sobre todo para alumnos de los primeros años de ingenierías relativas, pero que igual es útil para profesionales ya hechos y derechos (muchas veces olvidamos lo elemental). Salió en el original el 4 de Junio de 2008 y el autor tiene un blog en (http://duartes.org/gustavo/blog/) (Su nombre es Gustavo Duarte, y en el mismo blog encontrarán bastante material de muy buena calidad, de hecho pretendo hacer una "serie" de traducciones de sus trabajos). El artículo original lo pueden encontrar aquí http://duartes.org/gustavo/blog/post/motherboard-chipsets-memory-map  Cuando aparezca texto en cursivas rojas es mío, además en esta traducción incluí una imagen del mapa de memoria que refiere el original (de un Suse que tengo virtualizado en mi laptop) porque creo ilustra esa parte muy bien, espero les resulte útil y espero sus comentarios.


Tarjetas madre, chipsets y el mapa de memoria.

Voy a escribir algunos posts acerca del funcionamiento interno de las computadoras con el objetivo de explicarles como funcionan los kernels modernos. Espero que les sean útiles a programadores y entusiastas por igual  a los que interesan esta clase de cosas pero no tienen mucha experiencia. El enfoque es en Windows, Linux y procesadores Intel. El funcionamiento interno es un hobby que tengo, he escrito alguna cantidad de código para modo kernel pero hace un tiempo que no lo hago. Este primer post describe la estructura de las tarjetas madre basadas en procesadores Intel, como el procesador accede a la memoria y como esta estructurado el mapa de memoria del sistema.
Para empezar démosle una ojeada a como está estructurada una computadora Intel moderna. El diagrama de abajo muestra los componentes principales en colores de dudoso gusto:
Diagrama de una Tarjeta madre moderna. El Northbridge y el Southbridge componen el chipset.

Como ves, lo importante es saber que el procesador en realidad no sabe nada sobre a que esta conectado. Le habla al exterior a través de sus pines pero no le interesa "que hay afuera" (comillas mías). Puede ser la tarjeta madre de una PC pero puede ser una tostadora, un router, un implante cerebral o un banco de pruebas de procesadores. Hay tres modos básicos mediante los cuales el procesador se comunica con el exterior: el espacio de direcciones de memoria, el espacio de direcciones de entrada/salida (E/S) y las interrupciones. De momento solo nos ocuparemos de la tarjeta madre y de la memoria.

En una tarjeta madre, el procesador "sale" al exterior a través del bus frontal conectado al "puente norte" (Northbridge en lo adelante, al referirme al puente sur igualmente lo sustituiré por Southbridge). Cada vez que necesita leer o escribir en memoria lo hace a través de este bus. Usa determinados pines para transmitir la dirección física de memoria en la que quiere escribir o leer, mientras que emplea otros (pines) para enviar el valor que va a escribir o para recibir el valor que esta leyendo. Un Intel Core 2 QX6600 tiene 33 pines para transmitir la dirección física de la memoria así que tiene 2 elevado a la 33 (8589934592) localizaciones posibles de memoria y 64 pines para enviar o recibir datos (de manera que los datos son transmitidos por sobre un camino de 64 pistas, o trozos de 8 bytes). Esto le permite al procesador direccionar físicamente 64 Gigabytes de memoria (2 elevado a la 33 (localizaciones) multiplicado por 8
(trozos de) bytes las diferencias si sacan la cuenta son lógicas, y debidas a la misma razón por la que 2 elevado a la 10 da 1024, estamos hablando en binarios) a pesar de que la mayoría de los chipsets solo manipulan hasta 8 Gigas de RAM.

Y ahora viene el truco. Estamos habituados a pensar en la memoria solo en términos de RAM, el ente en que los programas escriben o leen todo el tiempo. Y en verdad la mayoría de las solicitudes desde el procesador son enviadas a los módulos de RAM a través del "Northbridge". Pero no todas. Las direcciones físicas de memoria son empleadas también para comunicarse con una plétora de dispositivos en la tarjeta madre (esta clase de comunicación es llamada entrada/salida mapeada en memoria). Estos dispositivos incluyen tarjetas de video, la mayoría de las tarjetas PCIs (digamos un scanner o una tarjeta SCSI) y también la memoria flash que almacena el BIOS.  

Cuando el northBridge recibe una solicitud de memoria física decide hacia donde routearla (enviarla): ¿debería ir a RAM?, ¿quizas a la tarjeta de video?. Esta decisión es tomada en base al mapa de direcciones de memoria. Para cada región de direcciones de memoria física, el mapa conoce el dispositivo que ocupa esa región. La mayor parte de las direcciones son asignadas a la RAM, pero cuando no, el mapa de memoria le indica al chipset que dispositivo deberá servir las solicitudes para determinada dirección. Este mapa de direcciones de memoria, alejado de los módulos de RAM causa el clásico "hueco"  en la memoria de la PC entre los 640kb  y el primer (1)mb. Otro hueco mayor resulta cuando se reservan direcciones para tarjetas de video y dispositivos PCI. Esta es la razón por la que los sistemas operativos de 32 bits tienen problemas para usar memorias de 4Gb. En Linux, el archivo /proc/iomem lista con claridad cada rango mapeado de estas direcciones. 

A resultas del comando "cat /proc/iomem".


El diagrama de abajo muestra un mapa de memoria típico para los primeros 4Gb de direcciones físicas de memoria en una PC Intel.

Esquema de memoria para los primeros 4 Gb en un sistema Intel.

Las direcciones reales y los rangos dependerán de la tarjeta madre específica, pero la mayoría de los sistemas de doble núcleo son mas o menos parecidos al esquema. Todas las regiones en marrón son mapeadas lejos de la RAM. Recuerde que estas son direcciones físicas usadas por los buses de la motherboard. Dentro del CPU (por ejemplo, en los programas que escribimos y ejecutamos), las direcciones de memoria son lógicas, y deberán ser traducidas a direcciones físicas antes de acceder al bus.
Las reglas para la traducción de direcciones lógicas a direcciones físicas son complejas y dependen del modo en que este corriendo el CPU (modo real, modo protegido de 32 bits, o modo protegido de 64 bits). Independientemente del mecanismo de traducción, el modo del CPU determinará cuanta memoria física podrá ser accedida. Por ejemplo, si el procesador está corriendo en modo de 32 bits, entonces solo será capaz de direccionar 4 Gb de memoria física (2 elevado a la 32) (existe una excepción llamada extensión de direcciones físicas pero, de momento, ignorémosla). Como que cerca del Giga superior (referido a 1 Gb) quedará reservado para mapear dispositivos de la motherboard el CPU entonces solo usará efectivamente cerca de 3 Gb de RAM (a veces menos, mi máquina tiene instalados un MSW Vista y solo quedan disponibles 2.4 Gb). Si el CPU corre en modo real, entonces solo podrá direccionar 1 Mb de RAM física (este era el único modo en el que podían trabajar los primeros procesadores Intel). Por otra parte, un procesador que corre en modo de 64 bits puede acceder fisicamente a 64 Gb de memoria (muy pocos chipsets soportan esas cantidades de RAM en realidad). En el modo de 64 bits es posible usar direcciones físicas por encima de la memoria RAM total del sistema para acceder las regiones en RAM correspondientes a direcciones físicas usadas por los dispositivos PCI. Esto es llamado "memoria reclamada" y es implementado con ayuda del chipset.   

Esta es toda la memoria que necesitamos para el siguiente post, el cual describirá el proceso de arranque desde que se energiza la PC y hasta que el cargador de arranque esta por pasar el control al kernel. Si quieres aprender mas acerca de esta clase de cosas te recomiendo mucho los manuales de Intel. Hay otras fuentes primarias, pero los manuales de Intel estan muy bien escritos y son muy exactos. Aquí hay algunos:


  •  Datasheet for Intel G35 Chipset documenta un chipset representativo para procesadores Core 2. Esta fue la fuente fundamental para este post.
  •  Datasheet for Intel Core 2 Quad-Core Q6000 Sequence es la hoja de datos (el catálogo) del procesador. Documenta cada pin del procesador (en realidad no son tantos, y luego de que los agrupas comprendes que no son muchos). Material fascinante, algunas partes ya están un poco viejas.
  • Intel Software Developer’s Manuals (El manual del desarrollador de software de Intel) es increíble. Lejos de haber envejecido, explica de manera elegante toda clase de cosas sobre arquitectura. Los volúmenes 1 y 3A traen lo bueno (no se asusten por el término (volumen), son volúmenes pequeños y pueden ser leídos de manera selectiva). 
  • Pádraig Brady sugirió que deje un enlace a el excelente trabajo de Ulrich Drepper acerca de la memoria. Es algo increíble. Espero hacerlo en un trabajo que haré sobre la memoria, pero es mejor que sobre.
Nota final:
En la última imagen, traduje "legacy" como "heredado" y como ambos términos no son muy entendibles a veces, me tomo el trabajo de hacer la aclaración. Los sistemas (sean soft o hard) "legacy" son sistemas que por alguna razón han quedado obsoletos o anticuados pero que por otras razones, no son tan sencillos de sustituir, de modo que de alguna manera se les extiende el soporte.