Ir al contenido principal

Recientemente respondí a una pregunta de un cliente de VOS que quería saber cómo alinear sus regiones de memoria virtual compartida entre sus programas legacy y sus nuevos programas basados en POSIX.

Este cliente había utilizado el comando create_data_object para crear varias regiones de memoria virtual compartida diferentes. A continuación, había utilizado un archivo de control de enlace para garantizar que cada programa hiciera referencia a las regiones en el mismo orden y en la misma dirección virtual.  El problema era que, independientemente de cómo utilizara el comando gcc para vincular sus nuevos programas basados en POSIX, no conseguía alinear las regiones SVM. Los nuevos programas colocaban las regiones SVM en direcciones diferentes. Ni siquiera el uso de un archivo de enlace con gcc servía de ayuda.

El mapa de enlace (o el resultado del comando display_program_module) revela que los programas POSIX siempre comienzan con los módulos de objeto «s_start_c_program» y «crti». El módulo de objeto s_start_c_program aparece más adelante en el legacy , y el módulo de objeto crti no aparece en absoluto.  La presencia de estos dos módulos de objeto empuja todos los módulos de objeto posteriores hacia abajo en el archivo, lo que da lugar a la desalineación.

No hay forma de evitar que gcc coloque estos dos módulos objeto al principio del módulo del programa. Por lo tanto, la solución es cambiar la forma en que se vinculan los legacy .  Dado que las regiones SVM deben comenzar en un límite de página y que el tamaño combinado de las regiones de código s_start_c_program y crti es inferior a una página, todo lo que tenemos que hacer es asignar una página adicional sin usar al comienzo de los legacy . Utilice el comando create_data_object para crear un objeto de datos de 4096 bytes e inclúyalo en el archivo de control de enlace como el primer módulo de objeto.

Acordamos mantener el tamaño de estos dos programas en 1 página (4096) bytes o menos, por lo que esta solución funcionará en el futuro.

Si tienes alguna pregunta sobre esta técnica, por favor publícala a continuación.