This article needs additional citations for verification. (November 2015) |
Una ROM opcional para la plataforma de PC (es decir, la IBM PC y los sistemas informáticos sucesores derivados) es una pieza de firmware que reside en la ROM de una tarjeta de expansión (o se almacena junto con el BIOS del sistema principal ), que se ejecuta para inicializar el dispositivo y (opcionalmente) agregar soporte para el dispositivo al BIOS. En su uso habitual, es esencialmente un controlador que interactúa entre la API del BIOS y el hardware. Técnicamente, una ROM opcional es un firmware que ejecuta el BIOS después de POST (la prueba e inicialización del hardware básico del sistema) y antes del proceso de arranque del BIOS, obteniendo el control completo del sistema y, en general, sin restricciones en lo que puede hacer. El BIOS depende de cada ROM opcional para devolver el control al BIOS para que pueda llamar a la siguiente ROM opcional o comenzar el proceso de arranque. Por esta razón, es posible (pero no habitual) que una ROM opcional mantenga el control y se adelante al proceso de arranque del BIOS. El BIOS (al menos como fue diseñado originalmente por IBM) generalmente busca e inicializa (ejecutando) ROM de opciones en orden de dirección ascendente en intervalos de dirección de 2 KB dentro de dos rangos de direcciones diferentes por encima de la dirección C0000h en el espacio de direcciones de memoria convencional (20 bits); los sistemas posteriores también pueden escanear rangos de direcciones adicionales en el espacio de direcciones extendido de 24 o 32 bits.
Las ROM opcionales son necesarias para permitir el arranque de dispositivos periféricos que no sean Plug and Play y para ampliar la BIOS a fin de brindar compatibilidad con cualquier dispositivo periférico que no sea Plug and Play de la misma manera que se admiten los periféricos estándar e integrados en la placa base. Las ROM opcionales también se utilizan para ampliar la BIOS o para agregar otros servicios de firmware a la BIOS. En principio, una ROM opcional podría proporcionar cualquier tipo de extensión de firmware, como una biblioteca de subrutinas de gráficos de video o un conjunto de servicios de procesamiento de audio PCM , y hacer que se instale en la RAM del sistema y, opcionalmente, en el sistema de interrupción de la CPU antes del momento del arranque.
Una ROM opcional común es el BIOS de video que se carga muy temprano en el proceso de arranque y engancha INT 10h para que se pueda mostrar la salida de la prueba automática de encendido (POST). El BIOS de video casi siempre se encuentra en el segmento de memoria que comienza en , el comienzo del área de memoria reservada para las ROM opcionales; esto se debe a que cuando la placa base tiene un controlador VGAC0000h
incorporado , la ROM opcional residirá en el BIOS: el BIOS sabe dónde está y la oculta en la RAM en un momento fijo. Otras ROM se pueden ubicar desde segmentos hasta en las primeras PC. [1] La dirección de búsqueda final estaba limitada al segmento [2] o [3] en los productos modernos. La especificación de arranque del BIOS requiere que las ROM opcionales se alineen con los límites de 2 kB (por ejemplo, segmentos , etc.). Los primeros dos bytes de la ROM deben ser . [4] El tercer byte indica el tamaño de la ROM en bloques de 512 bytes (por ejemplo, para ROM de 16 kB). Y el cuarto byte es donde el BIOS comienza la ejecución de la ROM opcional para inicializarla antes de que arranque el sistema. A menudo, esta inicialización se realiza mediante una instrucción de salto de 3 bytes que comienza con un valor hexadecimal . [5]C8000h
F4000h
DFFFFh
EFFFFh
C8000h, C8800h, C9000h, C9800h
55 AA
20h
E9
Antes del desarrollo y la adopción generalizada del estándar Plug and Play BIOS, un dispositivo adicional, como un controlador de disco duro o una tarjeta adaptadora de red (NIC), generalmente requería incluir una ROM opcional para poder arrancar, ya que la BIOS de la placa base no incluía ningún soporte para el dispositivo y, por lo tanto, no podía incorporarlo en el protocolo de arranque de la BIOS. Una ROM opcional de este tipo conectaría INT 19h, la interrupción de arranque de la BIOS, para adelantarse al cargador de arranque de la BIOS y sustituir su propio cargador de arranque. El cargador de arranque en la ROM opcional intentaría arrancar desde un disco, red u otra fuente de programa de arranque conectado o instalado en la tarjeta adaptadora; si ese intento de arranque fallaba, pasaría el control al cargador de arranque anterior (al que apuntaba INT 19h antes de que la ROM opcional lo conectara), lo que permitía que el sistema arrancara desde otro dispositivo como estrategia de respaldo. Algunas tarjetas adaptadoras, como ciertos adaptadores SCSI (por ejemplo, algunos fabricados por Adaptec), estaban disponibles en versiones que solo se diferenciaban en la presencia o ausencia de la ROM opcional para permitir el arranque desde dispositivos SCSI conectados. Como resultado del protocolo de escaneo de ROM de opción, la ROM de opción con la dirección más alta es la última en inicializarse y, por lo tanto, la última en enganchar cualquier interrupción y la primera en esas cadenas de rutina de servicio de interrupción (ISR); por lo tanto, las direcciones de las ROM de opción determinan completamente la prioridad de arranque entre las tarjetas adaptadoras que están habilitadas para el arranque, y los dispositivos de arranque compatibles con el BIOS de la placa base tienen colectivamente la prioridad más baja, es decir, el sistema intentará arrancar desde ellos solo después de intentar arrancar desde todas las tarjetas adaptadoras habilitadas para el arranque.
La especificación de arranque del BIOS (BBS) fue desarrollada por un consorcio que comprende Compaq , Intel y Phoenix Technologies para estandarizar la secuencia de inicialización del BIOS Plug and Play (PnP) y las ROM opcionales. [3] El estándar presenta la noción de una tabla de vectores de conexión de arranque (BCV) y la prioridad de BCV. [3] Los principios básicos del estándar hacen que el comportamiento sea más definido y depurable y da a los fabricantes de BIOS espacio para dinamizar aún más la selección del dispositivo de arranque para el usuario, más allá de las sugerencias del estándar. El comienzo del encabezado de expansión PnP está marcado por la firma ASCII$PnP
de 4 bytes y un puntero a esto se almacena en el desplazamiento +1Ah como un valor little endian de 2 bytes. [6]
Una vez que se completan las comprobaciones POST básicas, el BBS especifica que el BIOS detectará y copiará todas las ROM de opción que residen en el BIOS en la región antes mencionada y recorrerá el espacio de configuración PCI , llenando XROMBAR y copiando las ROM de opción de la tarjeta de expansión desde el espacio MMIO a la región. El BIOS luego escanea la región y, si la ROM de opción tiene un encabezado de expansión PnP, realiza una llamada lejana al desplazamiento +03h en el encabezado de la ROM de opción para inicializarlo. Luego vuelve a escanear la región después de que se hayan inicializado todas las ROM de opción PnP (porque, como indica el apéndice E, la rutina de inicialización de la ROM de opción puede haber encadenado más encabezados de expansión PnP para discos individuales que posee el dispositivo). Agrega el puntero BCV (si está presente) en los encabezados de expansión PnP que encuentra en la tabla BCV o el puntero BEV (si está presente) a la tabla de prioridad IPL. Las entradas BCV en la tabla BCV luego se llaman de acuerdo con la prioridad configurable en NVRAM . La tabla BCV está llena de punteros de función BCV pero tiene una entrada fija que representa las ROM de opción heredadas, que es un puntero a una rutina de BIOS que llama a +03h en todas las ROM de opción restantes que no tienen un encabezado de expansión PnP. La función BCV inicializa los ganchos INT 13h e INT 19h, que el BBS estipula que no deben realizarse en la rutina de inicialización en +03h. Si un dispositivo no tiene un encabezado de expansión PnP, puede realizar cualquier gancho en la rutina en +03h, ya que es una tarjeta heredada.
En la rutina de inicialización inicial, como la ROM de opción apunta a una estructura de datos PCI (no la misma que el espacio de configuración), el código de la ROM de opción sabe que el dispositivo y la identificación del proveedor están en un desplazamiento fijo de RIP . El comienzo de esta estructura está marcado por la firma ASCIIPCIR
de 4 bytes y un puntero a esto se almacena en el desplazamiento +18h como un valor little endian de 2 bytes. [6] Esto le permite escanear el espacio de configuración PCI para encontrar el dispositivo correcto y las BAR que necesita usar. Para evitar este escaneo, y en el caso de dos tarjetas idénticas en el sistema, el BIOS pasa el PFA (bus/dispositivo/función) a la rutina de inicialización en AX, y el número de selección de tarjeta (CSN) para las ROM de opción ISA se pasa en BX. Luego puede interactuar con el dispositivo usando PMIO / MMIO para ver cuántos discos tiene y cuáles son arrancables leyendo el MBR . El BIOS ya habrá examinado el espacio de configuración, asignado las BAR y completado la tabla ACPI antes de la llamada a la rutina de inicialización, por lo que la ROM opcional utilizaría las direcciones asignadas a sus BAR. Sin embargo, el BCV conecta rutinas de interrupción que interactúan con el dispositivo que se ajustan en función de la ubicación de la dirección MMIO base, la información del disco determinada en la rutina de inicialización de la ROM opcional y el número de disco actual en la BDA.
El procedimiento BIOS INT 19h utiliza entonces la prioridad de la tabla IPL en NVRAM para decidir si se debe llamar a una entrada que contenga un controlador de arranque que lea el MBR de 00h (BAID del disquete; el primer dispositivo en la tabla BCV que registre el disco 00h), una entrada que contenga un controlador de arranque que lea el MBR de 80h (BAID del disco duro; el primer dispositivo en la tabla BCV que registre el disco 80h) o una de las entradas BEV en la tabla. Un dispositivo solo tiene un BEV o un BCV si es un dispositivo de arranque.
Una tarjeta controladora SCSI puede conectar la INT 13h , que es responsable de proporcionar servicios de disco. Lo hará en su BCV si es una tarjeta PnP. Una vez que haya hecho esto, cualquier llamada posterior a la INT 13h será "capturada" por la ROM de opciones SCSI (o "SCSI BIOS"), lo que le permitirá responder por los discos que puedan existir en el bus SCSI. Antes de conectar la interrupción, es posible que no haya habido discos en el sistema, pero al interceptar la interrupción y alterar los valores devueltos, la SCSI BIOS puede hacer que todos los discos en el bus SCSI sean visibles para el sistema.
En este caso particular, el BIOS puede llamar a INT 13h para proporcionar una lista de posibles dispositivos de arranque al usuario y, como el BIOS SCSI ha enganchado la interrupción, el usuario podrá elegir no solo desde qué dispositivos de sistema estándar arrancar, sino también desde qué discos SCSI. Esto se debe a que, como se sugiere en el Apéndice D de la Especificación del BIOS de arranque, el BIOS podría llenar la tabla IPL con información de dispositivos y proveedores a partir de llamadas INT 13h a los diferentes discos, junto con el Número de disco duro (80h, 81h ...), para permitir que se arranque desde cualquier dispositivo de disco duro, en lugar de solo desde el primer disco del primer controlador que enganche INT 13h (el elemento de mayor prioridad en la tabla BCV), al que se hace referencia como Dispositivo IPL compatible con BIOS (BAID) en la especificación.
Varios controladores pueden conectar INT 13h a la vez. Por ejemplo, después del controlador SCSI, un controlador AHCI también puede conectar INT 13h colocando una llamada al controlador anterior, que fue almacenado en el IDT en la entrada 13h por el controlador SCSI, al final de su propio controlador, antes de colocar la dirección de su propio controlador en el IDT en la entrada 13h. El primer controlador que conecte INT 13h verá que se han instalado 0 discos al verificar el byte en 0040:0075
, que reside en el Área de datos del BIOS (BDA), y si tiene 4 discos para enumerar, asignará el rango de números de disco 80h–83h y almacenará '4' en el BDA. Si el segundo controlador que conecta INT 13h tiene 2 discos, leerá '4' del BDA, asignará los números de disco 84h y 85h, y almacenará '6' en lugar del '4'. Ahora bien, si se llama a INT 13h con DL = 83h, el controlador del segundo controlador, que no asignó el número de disco 83h, retransmitirá la llamada al controlador anterior; ese controlador, que sí asignó el número de disco 83h, se encargará de la llamada por sí mismo. Con cualquier número de ISR de controladores conectados a INT 13h, los ISR pasarán el control al siguiente hasta que el que asignó el número de unidad especificado reconozca el número, gestione la llamada y regrese de la interrupción.
Otra ROM de opción común es una ROM de arranque de red . La ROM de opción contiene el programa necesario para descargar el código de arranque. Las ROM originales de IBM Personal Computer enganchaban INT 18H (originalmente para invocar Cassette BASIC ) e INT 19H, ya que estas dos interrupciones se usaban para el proceso de arranque. INT 19h se llama para iniciar el proceso de arranque, y INT 18h se llamaba para iniciar Cassette BASIC desde la ROM cuando el proceso de arranque encontraba que ninguno de los posibles dispositivos de arranque era arrancable. Originalmente, al enganchar INT 18h, la ROM del adaptador de red intentaría arrancar desde la red cuando todos los demás dispositivos de arranque (unidades de disquete, discos duros, etc.) hubieran fallado. Al enganchar INT 19H, la ROM del adaptador de red intentaría arrancar desde la red antes que cualquier otro dispositivo. El BBS especifica que la ROM de opción NIC no engancha INT 19h, sino que en su lugar el manejador BIOS 19h debe llamar al BEV, que luego descargará el código de arranque.
El BIOS de video proporciona algunos servicios básicos de visualización para BIOS y sistemas operativos , por ejemplo, INT 10H (Legacy BIOS), VBE (Legacy BIOS) y UEFI GOP . El BIOS original de IBM PC incluía soporte integrado para los adaptadores de video IBM CGA y MDA (y no admitía ROM opcionales en absoluto), por lo que esas tarjetas de video no tenían ROM opcionales. El soporte CGA y MDA en el BIOS propiamente dicho se mantuvo a través de las líneas de productos IBM PC XT y PC AT (que sí admitían ROM opcionales), de modo que esas tarjetas funcionaban (con soporte completo de BIOS) en esas máquinas. La primera tarjeta adaptadora de video de PC que tenía una ROM opcional fue la IBM EGA, presentada en 1984 con la IBM PC AT. (La tarjeta gráfica Hercules no tenía ROM opcional ni soporte de BIOS excepto por sus características compatibles con MDA, para las cuales dependía del soporte MDA provisto por IBM en el BIOS principal). La mayoría de los adaptadores de video de PC posteriores fueron compatibles con ROM opcionales, aunque VGA y MCGA integrados en placas base PS/2 pueden haber utilizado soporte de BIOS integrado. Una vez que las Super VGA integradas (SVGA), integradas en las placas base de las PC clonadas, eran proporcionadas por empresas distintas a los sistemas mismos, se volvió común que el BIOS de video proporcionado por el proveedor de SVGA se incluyera como un módulo ROM opcional separado en el mismo chip BIOS que el BIOS del sistema principal (proporcionado por una tercera empresa independiente).
This section needs expansion. You can help by adding to it. (November 2019) |
Las ROM opcionales UEFI utilizan la Interfaz de firmware extensible unificada (UEFI). Varias imágenes de ROM opcionales en un solo dispositivo pueden incluir tanto ROM opcionales UEFI como x86 heredadas. Esta doble compatibilidad en dispositivos puede funcionar tanto en BIOS heredadas como en entornos UEFI modernos. Cuando el formato de ROM opcional se establece en “UEFI Compatible” en la configuración UEFI, la etapa del entorno de ejecución del controlador (DXE) priorizará la carga de la ROM opcional UEFI si está presente. Si no hay una ROM opcional UEFI disponible, el sistema volverá a la ROM opcional heredada. Los sistemas UEFI pueden utilizar ROM opcionales heredadas a través del Módulo de soporte de compatibilidad (CSM). Cuando se habilita el arranque seguro, se prohíbe la ejecución de CSM y ROM opcionales heredadas, ya que los controladores de firmware heredados no admiten la autenticación, lo que crea una posible vulnerabilidad de seguridad. [7] [8]