El agujero PCI o agujero de memoria PCI es una limitación del hardware de 32 bits y de los sistemas operativos de 32 bits que hace que una computadora parezca tener menos memoria disponible que la que está instalada físicamente. [1] Esta limitación de direccionamiento de memoria y las soluciones alternativas posteriores necesarias para superarla son funcionalmente similares a los límites de memoria de la arquitectura de memoria de la IBM PC 8088 temprana (ver Memoria convencional ).
En la historia de la informática han surgido con frecuencia situaciones similares, cuando el hardware destinado a tener hasta un cierto nivel de recursos está diseñado para manejar varias veces la cantidad máxima esperada, lo que finalmente se convierte en una restricción severa a medida que la ley de Moore aumenta los recursos económicamente disponibles. El IBM PC original se suministraba normalmente con 64 KB de memoria o menos; estaba diseñado para aceptar un máximo de 640 KB . Esto se convirtió rápidamente en una restricción que tuvo que ser manejada por una compleja gestión de memoria DOS . Restricciones sucesivas similares en tamaño se han impuesto y superado en los discos duros .
La pérdida de memoria utilizable causada por el agujero PCI, cuando se utilizan E/S mapeadas en memoria , se debe a que se utiliza el mismo espacio de direcciones tanto para la memoria física como para comunicarse con los dispositivos de hardware. Por lo tanto, los dispositivos de hardware instalados necesitan parte del espacio de direcciones para comunicarse con el procesador y el software del sistema. Como el hardware de 32 bits tiene un total de cuatro gigabytes de memoria direccionable, [a] parte de la memoria física real de una máquina de 32 bits, cuando se instala suficiente memoria, debe sacrificarse ocultándola para que los dispositivos tengan espacio para comunicarse. La parte de la memoria física que se reemplaza con el espacio de comunicación del dispositivo depende de la máquina, pero normalmente es algo por encima de 2,5 a 3,5 GB.
La cantidad de memoria del sistema que está oculta y no disponible varía ampliamente según la placa base y el chipset, el BIOS, la cantidad de memoria física, la cantidad de RAM de video instalada en las tarjetas gráficas y la cantidad y el tipo de tarjetas PCI instaladas en el sistema. Es posible que más de un gigabyte de memoria del sistema de 32 bits no esté disponible cuando se instalan cuatro gigabytes de memoria física y varias tarjetas 3D con grandes cantidades de memoria de video; en algunas placas base, el espacio siempre tiene al menos un gigabyte de tamaño independientemente de las tarjetas de expansión instaladas .
Una solución alternativa desarrollada por primera vez en Pentium Pro, conocida como extensión de dirección física (PAE), permite que ciertos sistemas operativos de 32 bits accedan a direcciones de memoria de hasta 36 bits, aunque los programas individuales aún están limitados a operar dentro de un espacio de direcciones de 32 bits. Siempre que haya suficiente memoria instalada, cada programa puede tener su propio espacio de direcciones de cuatro gigabytes, y juntos pueden utilizar hasta 64 gigabytes de memoria en todos los programas.
Pero PAE por sí solo no es suficiente para solucionar el problema del agujero PCI, ya que las direcciones de memoria y las direcciones PCI de E/S todavía se superponen en algún lugar entre el 3.er y el 4.º gigabyte. Un sistema operativo compatible con PAE junto con una CPU compatible con PAE no puede hacer nada mejor que acceder a la memoria del 1.er al 3.er gigabyte, y luego del 5.º al 64.º gigabyte. El agujero PCI sigue estando allí. En un host de 4 GB, y en ausencia de una u otra solución alternativa adicional, PAE no hace nada para acceder a la memoria de ~1 GB superpuesta por la E/S PCI.
PAE fue totalmente compatible con Windows XP hasta el lanzamiento del Service Pack 1 (SP1), pero luego se retiró para SP2; las únicas versiones de 32 bits de Microsoft Windows que lo admiten completamente son ciertas versiones de servidor de alta gama de Windows Server 2003 y anteriores; a partir de 2014, se usa principalmente en distribuciones de Linux de 32 bits; Ubuntu lo ha hecho obligatorio para su versión de 32 bits desde 2013. Microsoft deshabilitó el soporte en Windows XP SP2 y sistemas operativos posteriores porque había muchos problemas de compatibilidad con tarjetas gráficas y otros dispositivos, que necesitaban controladores compatibles con PAE, distintos de los controladores estándar de 32 bits y posteriores de 64 bits. [2] Muchas versiones de MS Windows pueden activar lo que todavía se llama PAE con el propósito de usar el bit NX , pero esto ya no extiende el espacio de direcciones.
Como se dijo anteriormente, en sistemas con PAE de 32 bits e incluso de 64 bits, la memoria por debajo y por encima del "hueco de memoria" está disponible, pero entre 512 MB y 1,5 GB de RAM no están disponibles, alrededor del tercer gigabyte, porque utilizan las direcciones de memoria requeridas por los dispositivos. Con la disminución del costo de la memoria, esto puede no ser un problema grave, pero hay formas de recuperar el acceso a la memoria faltante.
Las limitaciones del agujero PCI de 32 bits pueden afectar a los sistemas operativos de 64 bits, ya que el BIOS del sistema debe tener en cuenta todos los sistemas operativos que son compatibles con el hardware (los sistemas operativos de 16, 32 y 64 bits se ejecutan en el mismo hardware). El BIOS debe poder iniciar mapeando todos los dispositivos por debajo de los cuatro gigabytes, aunque un sistema de 64 bits no lo requiere. El usuario puede configurar muchos BIOS para que llenen el agujero de memoria mapeando dispositivos que se encuentren en la parte superior del espacio de direcciones de 64 bits, siempre que los dispositivos, sus controladores y el chipset lo admitan. Una máquina configurada de esta manera no puede iniciar un sistema operativo de 16 o 32 bits; solo se admite el modo de arranque UEFI.
Otra forma de eliminar el orificio PCI, que sólo es útil para sistemas operativos de 64 bits y aquellos sistemas de 32 bits que admiten el método de extensión de dirección física descrito anteriormente, es "reasignar" parte o toda la memoria entre los límites de dos y cuatro gigabytes a direcciones superiores a cuatro gigabytes. Esto debe ser compatible con el chipset de la computadora y, por lo general, se puede activar en la configuración del BIOS. Esta reasignación funciona en el nivel de direcciones físicas , a diferencia de la reasignación de nivel superior de direcciones virtuales a físicas que ocurre dentro del núcleo de la CPU . Activar esto para los sistemas operativos tradicionales de 32 bits hace más daño que bien, ya que la memoria reasignada (a menudo más grande que el propio orificio PCI) no se puede utilizar en dichos sistemas operativos, aunque, por ejemplo, Windows Vista mostrará que dicha memoria existe físicamente en la página "Propiedades del sistema".