Recientemente respondí a una pregunta de un cliente de VOS que quería saber cómo hacer que sus regiones de memoria virtual compartida se alineen entre sus programas legacy no POSIX y sus nuevos programas basados en POSIX.
Este cliente había usado el comando create_data_object para crear varias regiones de memoria virtual compartida diferentes. Luego había usado un archivo de control de enlace para asegurarse de que cada programa hiciera referencia a las regiones en el mismo orden y en la misma dirección virtual. El problema era que no importaba cómo usaba el comando gcc para vincular sus nuevos programas basados en POSIX, no podía hacer que las regiones SVM se alinearan. Los nuevos programas pusieron las regiones SVM en diferentes direcciones. Incluso el uso de un archivo bind con gcc no ayudaba.
El mapa bind (o la salida del comando display_program_module) revela que los programas POSIX siempre comienzan con los módulos de objetos "s_start_c_program" y "crti". El módulo de objeto s_start_c_program aparece más tarde en el programa legacy , y el módulo de objeto crti no aparece en absoluto. La presencia de estos dos módulos de objeto empuja a todos los módulos de objeto subsiguientes hacia abajo en el archivo, lo que resulta en la desalineación.
No hay forma de evitar que gcc ponga estos dos módulos de objetos primero en el módulo del programa. Así que la solución es cambiar la forma en que se vinculan los programas de legacy . Dado que las regiones SVM deben comenzar en un límite de página, y dado que el tamaño combinado de las regiones del programa s_start_c_program y del código crti son menores que una página, todo lo que necesitamos hacer es asignar una página extra, sin usar, al comienzo de los programas de legacy . Usar el comando create_data_object para crear un objeto de datos de 4096 bytes y ponerlo en el archivo de control bind como el primer módulo de objetos.
Acordamos mantener el tamaño de estos dos programas a 1 página (4096) bytes o menos, así que esta solución funcionará en el futuro.
Si tiene alguna pregunta sobre esta técnica, por favor escríbala abajo.