La página cero o página base es el bloque de memoria que se encuentra al comienzo del espacio de direcciones de una computadora ; es decir, la página cuya dirección inicial es cero. El tamaño de una página depende del contexto, y la importancia de la memoria de página cero en comparación con la memoria con direcciones más altas depende en gran medida de la arquitectura de la máquina. Por ejemplo, las familias de procesadores Motorola 6800 y MOS Technology 6502 tratan los primeros 256 bytes de memoria de manera especial, [1] mientras que muchos otros procesadores no lo hacen.
A diferencia del hardware más moderno, en la década de 1970 la RAM de la computadora era tan rápida como la CPU. [ cita requerida ] Por lo tanto, tenía sentido tener pocos registros y usar la memoria principal como un grupo extendido de registros adicionales. En máquinas con un bus de direcciones de 16 bits relativamente amplio y un bus de datos de 8 bits comparativamente estrecho , calcular una dirección en la memoria podía llevar varios ciclos. La dirección de un byte de la página cero era más pequeña y, por lo tanto, más rápida de leer y calcular que otras ubicaciones, lo que hacía que la página cero fuera útil para el código de alto rendimiento.
El direccionamiento de página cero ahora tiene un significado principalmente histórico, ya que los avances en la tecnología de circuitos integrados han hecho que agregar más registros a una CPU sea menos costoso y las operaciones de la CPU sean mucho más rápidas que los accesos a la RAM.
El tamaño real de la página cero en bytes lo determina el diseño del microprocesador y, en los diseños más antiguos, suele ser igual al valor más grande al que pueden hacer referencia los registros de indexación del procesador. Por ejemplo, los procesadores de 8 bits antes mencionados tienen registros de índice de 8 bits y un tamaño de página de 256 bytes. Por lo tanto, su página cero se extiende desde la dirección 0 hasta la dirección 255.
En los primeros ordenadores, como el PDP-8 , la página cero tenía un modo especial de direccionamiento rápido , que facilitaba su uso para el almacenamiento temporal de datos y compensaba la escasez de registros de la CPU . El PDP-8 tenía un solo registro, por lo que el direccionamiento de la página cero era esencial. En los modelos originales PDP-10 KA-10, los registros disponibles son simplemente las primeras 16 palabras, de 36 bits de longitud, de la memoria principal. Se puede acceder a esas ubicaciones como registros y como ubicaciones de memoria.
A diferencia del hardware más moderno, la RAM de las computadoras de la década de 1970 era tan rápida como la CPU. Por lo tanto, tenía sentido tener pocos registros y usar la memoria principal como un grupo extendido de registros adicionales. En máquinas con un bus de direcciones de 16 bits y un bus de datos de 8 bits , acceder a las ubicaciones de página cero podía ser más rápido que acceder a otras ubicaciones. Dado que las ubicaciones de página cero podían ser direccionadas por un solo byte , las instrucciones para acceder a ellas podían ser más cortas y, por lo tanto, de carga más rápida.
Por ejemplo, la familia MOS Technology 6502 tiene un solo registro de propósito general: el acumulador. Para compensar esta limitación y obtener una ventaja de rendimiento, el 6502 está diseñado para hacer un uso especial de la página cero, proporcionando instrucciones cuyos operandos son ocho bits, en lugar de 16, requiriendo así menos ciclos de búsqueda de memoria. Muchas instrucciones están codificadas de manera diferente para direcciones de página cero y páginas distintas de cero; esto se denomina direccionamiento de página cero en la terminología 6502 (se denomina direccionamiento directo en la terminología Motorola 6800 ; el Western Design Center 65C816 también se refiere al direccionamiento de página cero como direccionamiento de página directa ):
LDA $ 12 ; direccionamiento de página cero LDA $ 0012 ; direccionamiento absoluto
En lenguaje ensamblador 6502, las dos instrucciones anteriores cumplen la misma función: cargan el valor de la ubicación de la memoria $12
en el .A
registro (acumulador) ( $
es la notación del lenguaje ensamblador de Motorola/MOS Technology para un número hexadecimal). Sin embargo, la primera instrucción tiene solo dos bytes de longitud y requiere tres ciclos de reloj para completarse. La segunda instrucción tiene tres bytes de longitud y requiere cuatro ciclos de reloj para ejecutarse. Esta diferencia en el tiempo de ejecución podría volverse significativa en código repetitivo.
Algunos procesadores, como el Motorola 6809 y el WDC 65C816 antes mencionado, implementan un “registro de página directa” ( DP
) que le indica al procesador la dirección inicial en RAM de lo que se considera la página cero. En este contexto, el direccionamiento de página cero es nocional; el acceso real no sería a la página cero física si DP
se carga con alguna dirección distinta a $00
(o $0000
en el caso del 65C816).
Al contrario del uso preferencial original de la página cero, algunos sistemas operativos modernos como FreeBSD , Linux y Microsoft Windows [2] en realidad hacen que la página cero sea inaccesible para atrapar usos de punteros nulos . Dichos valores de puntero pueden indicar legítimamente valores no inicializados o nodos centinela , pero no apuntan a objetos válidos. El código con errores puede intentar acceder a un objeto a través de un puntero nulo, y esto puede atraparse a nivel del sistema operativo como una violación de acceso a memoria .
Sin embargo, algunas arquitecturas de computadoras todavía reservan el comienzo del espacio de direcciones para otros fines; por ejemplo, los sistemas Intel x86 reservan las primeras 256 palabras dobles del espacio de direcciones para la tabla de vectores de interrupción (IVT) si se ejecutan en modo real .
En la arquitectura ARM se empleó una técnica similar de uso de la página cero para vectores relacionados con el hardware. En programas mal escritos, esto podría llevar a un comportamiento "ofla", donde un programa intenta leer información de un área de memoria no deseada y trata el código ejecutable como datos o viceversa. Esto es especialmente problemático si el área de la página cero se utiliza para almacenar vectores de salto del sistema y se engaña al firmware para que los sobrescriba. [3]
En CP/M de 8 bits , la página cero se utiliza para la comunicación entre el programa en ejecución y el sistema operativo.
En algunas arquitecturas de procesador, como la del procesador Intel 4004 de 4 bits, la memoria estaba dividida en páginas (256 bytes) y se debían tomar precauciones especiales cuando el flujo de control cruzaba los límites de página , ya que algunas instrucciones de máquina exhibían un comportamiento diferente si se ubicaban en las últimas instrucciones de una página, por lo que solo se recomendaban unas pocas instrucciones para saltar entre páginas. [4]
{{cite book}}
: Mantenimiento de CS1: falta la ubicación del editor ( enlace )[…] ciertas instrucciones funcionan de manera diferente cuando se encuentran en el último byte (o bytes) de una página que cuando se encuentran en otro lugar. […] Dos direcciones están en la misma página si el dígito hexadecimal de orden más alto de sus direcciones es igual. […] Si la instrucción JIN se encuentra en la última ubicación de una página en la memoria, los 4 bits más altos del contador de programa se incrementan en uno, lo que hace que el control se transfiera a la ubicación correspondiente en la página siguiente. […] Si […] el JIN se hubiera ubicado en la dirección decimal 255 (0FF hexadecimal), el control se habría transferido a la dirección hexadecimal 115, no a la 015. Esta es una práctica de programación peligrosa y se debe evitar siempre que sea posible. […] los programas se almacenan en la memoria ROM o en la RAM de programa, ambas divididas en páginas. Cada página consta de 256 ubicaciones de 8 bits. Las direcciones 0 a 255 comprenden la primera página, 256-511 comprenden la segunda página, y así sucesivamente. En general, es una buena práctica de programación no permitir nunca que el flujo del programa cruce un límite de página, excepto mediante el uso de una instrucción JUN o JMS. […]