Sistemas operativos modernos

correspondencia entre el programa y la dirección 65,536, es fácil parchar el código de modo que la primera instrucción se convierta en JMP 65836. Sin embargo, ¿qué sucede si un segun­ do proceso ahora establece correspondencia entre el programa y la dirección 131,072? La ins­ trucción JMP 65836 ahora saltará a la dirección 65,836 en lugar de a la 131,372, y e! programa fallará. La solución es usar sólo desplazamientos relativos, no direcciones virtuales absolutas en código que va a compartirse. Por fortuna, la mayor parte de las máquinas tienen instrucciones que usan desplazamientos relativos, así como instrucciones que usan direcciones absolutas. Los compiladores pueden usar las instrucciones de desplazamiento relativo, pero de­ ben saber con antelación si hay que usar ésas o las de direcciones absolutas. Las instrucciones relativas no se usan siempre porque el código resultante suele ser menos eficiente. Por lo regu­ lar, una indicador del compilador señala cuál fipo de instrucciones hay que usar. La técnica de crear código que puede colocarse en cualquier dirección virtual sin necesidad de reubicación se denomina código independiente de la posición. Hace años, cuando los espacios de direcciones virtuales de 16 bits (o 20 bits) eran estándar pero las máquinas tenían megabytes de memoria física, se ideó todo fipo de ardides para que los programas pudieran usar más memoria física de la que cabía en el espacio de direcciones. Mu­ chos de esos ardides se incluían en el concepto de conmutación de bancos, en el que un progra­ ma podía sustituir un bloque de su propia memoria por algún bloque de memoria más allá del límite de 16 o 20 bits. Cuando se introdujeron las máquinas de 32 bits, se pensó que se tendría suficiente espacio de direcciones por toda la eternidad. No fue así. El problema ha vuelto a sur­ gir. Los programas grandes a menudo necesitan más de los 2 o 3 GB de espacio de direcciones de usuario que Windows 2000 les asigna, así que se ha vuelto a usar la conmutación de bancos, que ahora se llama extensiones de ventanas de direcciones. Este recurso permite establecer cor­ respondencia entre los programas y trozos desplazables de memoria dentro y fuera de la porción de usuario del espacio de direcciones (y sobre todo más arriba de la temida frontera de los 4 GB). Puesto que esto sólo se usa en servidores que tienen más de 2 GB de memoria física, aplazare­ mos la explicación de este mecanismo hasta la siguiente edición de este libro (cuando incluso las máquinas de escritorio más baratas estarán sintiendo que 32 bits no son suficientes). 11.5.2 Llamadas al sistema para administración de memoria La API Win32 incluye varias funciones que permiten a un proceso administrar en forma explí­ cita su memoria virtual. Las más importantes de esas funciones se presentan en la figura 11-25. Todas ellas operan en una región que consiste en una sola página, o bien, en una secuencia de dos o más páginas que son consecutivas en el espacio de direcciones virtual. Las primeras cuatro funciones de la API sirven para asignar, liberar, proteger y determinar la situación de regiones del espacio de direcciones virtual. Las regiones asignadas siempre principian en fronteras de 64 KB para reducir al mínimo los problemas de traslado a arquitec­ turas futuras cuyas páginas sean más grandes que las actuales (hasta 64 KB). La canfidad real de espacio de direcciones asignado puede ser menor que 64 KB, pero debe ser un múltiplo del tamaño de página. Las siguientes dos funciones permiten a un proceso fijar páginas en la me­ moria para que no se intercambien a disco, y cancelar tal propiedad. Por ejemplo, un programa de tiempo real podría necesitar esto. El sistema operativo impone un límite para evitar que los

RkJQdWJsaXNoZXIy MjI4NDcx