Dominios de cargador

En algunos entornos de programación, es deseable tener bibliotecas compartidas cargadas en la misma dirección virtual en cada proceso.

Debido a la naturaleza dinámica de las bibliotecas compartidas mantenidas por el cargador del sistema AIX®, esta condición no puede garantizarse. Los dominios de cargador proporcionan un medio para cargar bibliotecas compartidas en la misma dirección virtual en un conjunto de procesos.

El cargador del sistema carga bibliotecas compartidas en varias regiones de bibliotecas compartidas globales. Una región se denomina región de texto de biblioteca compartida, que contiene las instrucciones ejecutables para las bibliotecas compartidas cargadas. La región de texto de biblioteca compartida se correlaciona con la misma dirección virtual en cada proceso. La otra región es la región de datos de biblioteca compartida. Esta región contiene los datos de las bibliotecas compartidas. Puesto que los datos de biblioteca compartida son de lectura/grabación, cada proceso tiene su propia región privada que es una copia de la región de biblioteca compartida global. Esta región privada se correlaciona con la misma dirección virtual en cada proceso.

Puesto que las regiones de biblioteca compartida global se correlacionan en la misma dirección virtual en cada proceso, las bibliotecas compartidas se cargan en la misma dirección virtual en la mayoría de los casos. El caso en el que esto no es cierto es cuando hay más de una versión de una biblioteca compartida cargada en el sistema. Esto sucede siempre que se modifica una biblioteca compartida que está en uso, o se modifica cualquier biblioteca compartida de la que dependa. Cuando esto sucede, el cargador debe crear una nueva versión de la biblioteca compartida modificada y todas las demás bibliotecas compartidas que dependen de la biblioteca compartida modificada. Tenga en cuenta que todas las bibliotecas compartidas dependen en última instancia del Espacio de nombres de kernel. El Espacio de nombres de kernel contiene todas las llamadas del sistema definidas por el kernel y se puede modificar en cualquier momento en que se cargue o descargue dinámicamente una extensión de kernel. Cuando el cargador del sistema crea una nueva versión de una biblioteca compartida, la nueva versión debe estar ubicada en una ubicación diferente en los segmentos de biblioteca compartida global. Por lo tanto, los procesos que utilizan la nueva versión tienen las bibliotecas compartidas cargadas en una dirección virtual diferente a los procesos que utilizan las versiones anteriores de las bibliotecas compartidas.

Un dominio de cargador es un subconjunto de todas las bibliotecas compartidas que se cargan en el sistema. El conjunto de todas las bibliotecas compartidas cargadas en el sistema se denomina dominio de cargador global. Este dominio de cargador global se puede subdividir en dominios de cargador definidos por el usuario más pequeños. Un dominio de cargador definido por el usuario contiene una versión de cualquier biblioteca compartida en particular. Los procesos pueden especificar un dominio de cargador. Si un proceso especifica un dominio de cargador, el proceso utiliza las bibliotecas compartidas contenidas en el dominio de cargador. Si más de un proceso especifica el mismo dominio de cargador, utilizan el mismo conjunto de bibliotecas compartidas. Puesto que un dominio de cargador contiene una versión de cualquier biblioteca compartida en particular, todos los procesos que especifican el mismo dominio de cargador utilizan la misma versión de bibliotecas compartidas y tienen sus bibliotecas compartidas cargadas en la misma dirección virtual.

Utilización de dominios de cargador

Si un proceso utiliza un dominio de cargador, debe especificarse en el momento de la ejecución. El dominio de cargador especificado está en vigor y se utiliza durante toda la duración del proceso. Cuando un proceso que especifica un dominio de cargador llama a la llamada al sistema exec , el cargador del sistema realiza las acciones siguientes:

Busca/crea dominio de cargador
Los permisos de acceso asociados con el dominio de cargador se comprueban para determinar si este proceso puede utilizar el dominio de cargador. Si el proceso no tiene el privilegio suficiente para acceder (leer o escribir) al dominio de cargador, el proceso no utiliza ningún dominio. Si el proceso tiene privilegios suficientes, se busca en la lista de dominios de cargador que mantiene el cargador del sistema el dominio de cargador especificado por el proceso. Si no se encuentra el dominio de cargador especificado, se crea si el proceso tiene el privilegio suficiente. Si el proceso no tiene el privilegio suficiente para crear el dominio de cargador, la llamada exec falla y se devuelve un error.
Utiliza el dominio de cargador para limitar la búsqueda
Si el proceso necesita bibliotecas compartidas que ya están listadas en el dominio de cargador, se utiliza la versión de la biblioteca especificada en el dominio. La versión de la biblioteca compartida en el dominio de cargador se utiliza independientemente de otras versiones de la biblioteca compartida que puedan existir en el dominio de cargador global.
Añade bibliotecas compartidas al dominio de cargador
Si el proceso necesita una biblioteca que no está en el dominio de cargador, el cargador carga la biblioteca en la imagen de proceso siguiendo el convenio de cargador normal de cargar la versión más reciente. Si el proceso tiene privilegios suficientes, esta versión de la biblioteca también se añade al dominio de cargador. Si el proceso no tiene privilegios suficientes para añadir una entrada, la llamada exec falla y se devuelve un error.

Las bibliotecas compartidas también se pueden cargar explícitamente con la llamada al sistema load () . Cuando se carga explícitamente una biblioteca compartida, los datos de estos módulos se colocan normalmente en el valor de interrupción actual del proceso para un proceso de 32 bits. Para un proceso de 64 bits, los datos de los módulos se colocan en los módulos cargados de forma privada de la región. Si un proceso utiliza un dominio de cargador, el cargador del sistema coloca los datos en la región de datos de biblioteca compartida. La dirección virtual de este módulo cargado explícitamente es la misma para todos los procesos que cargan el módulo. Si el proceso tiene el privilegio suficiente, la biblioteca compartida se añade al dominio de cargador. Si el proceso no tiene privilegios suficientes para añadir una entrada, la llamada load falla y se devuelve un error.

Un dominio de cargador se puede asociar con cualquier archivo normal. Es importante tener en cuenta que un dominio de cargador está asociado con el archivo, NO con el nombre de vía de acceso del archivo. La modalidad (permisos de acceso) del archivo determina las operaciones que se pueden realizar en el dominio de cargador. Los permisos de acceso en el archivo asociado con el dominio de cargador y las operaciones permitidas en el dominio de cargador son los siguientes:

  • Si el proceso puede leer el archivo, el proceso puede especificar el dominio de cargador para limitar el conjunto de bibliotecas compartidas que utiliza.
  • Si el proceso puede grabar en el archivo, el proceso puede añadir bibliotecas compartidas al dominio de cargador y crear el dominio de cargador asociado con el archivo.

Si un proceso intenta crear o añadir entidades a un dominio de cargador sin privilegios suficientes, la operación en curso (exec o load) falla y se devuelve un error.

Los dominios de cargador se especifican como parte de la información de LIBPATH . La información de LIBPATH es una lista separada por dos puntos (:) de nombres de vía de acceso de directorio utilizados para localizar bibliotecas compartidas. La información de LIBPATH puede proceder de la variable de entorno LIBPATH o de la serie LIBPATH especificada en la sección de cargador del archivo ejecutable. Si el primer nombre de vía de acceso de la información de LIBPATH es un archivo normal, se especifica un dominio de cargador asociado con el archivo. Por ejemplo:

  • Si/etc/loader_domain/OOdomain_1es un archivo normal y, a continuación, establece la variable de entorno LIBPATH en la serie
    /etc/loader_domain/OOdomain_1:/lib:/usr/lib
    hace que los procesos creen y utilicen el dominio de cargador asociado con el/etc/loader_domain/OOdomain_1.xlsx
  • Si/etc/loader_domain/OOdomain_1es un archivo normal y, a continuación, elldomse crea con el mandato siguiente:
    cc -o ldom ldom.c -L/etc/loader_domain/OOdomain_1
    El nombre de vía de acceso/etc/loader_domain/OOdomain_1se inserta como la primera entrada en la información de LIBPATH de la sección de cargador para laldom.xlsx Cuandoldomse ejecuta, crea y utiliza el dominio de cargador asociado con el/etc/loader_domain/OOdomain_1.xlsx

Creación/supresión de dominios de cargador

Un dominio de cargador se crea la primera vez que un proceso con suficientes intentos de privilegio para utilizar el dominio. El acceso a un dominio de cargador se controla mediante el acceso al archivo normal asociado con el dominio. Los grabadores de aplicaciones son responsables de gestionar los archivos regulares asociados con los dominios de cargador utilizados por sus aplicaciones. Los dominios de cargador están asociados con archivos regulares NO los nombres de vía de acceso de los archivos. Los ejemplos siguientes ilustran este punto:

  • Los 2aplla aplicación ha especificado el dominio de cargadordomain01en su información de LIBPATH . Los 2apldespués se ejecuta la aplicación. El directorio de trabajo actual es/home/user1y contiene un archivo normaldomain1que es grabable porapl. Un nuevo dominio de cargador asociado con el archivo/home/user1/domain01se crea.aplse vuelve a ejecutar. Esta vez/home/user2es el directorio de trabajo actual, y también contiene un archivo normaldomain01que es grabable porapl. Un nuevo dominio de cargador asociado con el archivo/home/user1/domain02se crea.
  • Aplicaciónaplha especificado el dominio de cargador/etc/1_domain/domain01en su información de LIBPATH .apla continuación, se ejecuta./etc/1_domain/domain01es un archivo normal grabable porapl. Un nuevo dominio de cargador asociado con el archivo/etc/1_domain/domain01se crea.

    /home/user1/my_domaines un enlace simbólico al archivo/etc/1_domain/domain01.

    Aplicaciónap2ha especificado el dominio de cargador/home/user1/my_domainen su información de LIBPATH .ap2a continuación, se ejecuta. El cargador del sistema advierte que/home/user1/my_domainhace referencia al mismo archivo que/etc/1_domain/domain01. Un dominio de cargador ya está asociado con el archivo/etc/1_domain/domain01; por lo tanto, este dominio de cargador lo utiliza la aplicaciónap2.

  • Aplicaciónaplha especificado el dominio de cargador/etc/1_domain/domain01en su información de LIBPATH .apla continuación, se ejecuta./etc/1_domain/domain01es un archivo normal grabable porapl. Un nuevo dominio de cargador asociado con el archivo/etc/1_domain/domain01se crea.

    Archivo/etc/1_domain/domain01se suprime y se vuelve a crear como un archivo normal.

    Aplicaciónaplse vuelve a ejecutar. Ya no hay forma de acceder al archivo normal que está asociado con el dominio de cargador original/etc/1_domain/domain01. Por lo tanto, un nuevo dominio de cargador asociado con el archivo/etc/1_domain/domain01se crea.

Los dominios de cargador son estructuras dinámicas. Durante la vida de un dominio de cargador, se añaden y suprimen bibliotecas compartidas. Se añade una biblioteca compartida a un dominio de cargador cuando un proceso que ha especificado el dominio de cargador necesita una biblioteca compartida que todavía no existe en el dominio. Por supuesto, esto presupone que el proceso tiene el privilegio suficiente para añadir la biblioteca compartida al dominio del cargador.

Se mantiene un recuento de uso independiente para cada biblioteca compartida que es miembro de un dominio de cargador. Este recuento de uso realiza un seguimiento de cuántos procesos con dominios de cargador están utilizando la biblioteca compartida. Cuando este recuento de uso desciende a cero, la biblioteca compartida se suprime del dominio de cargador.