Rutinas de configuración PSE

Para dar soporte a la carga y descarga dinámicas, cada extensión PSE debe proporcionar una rutina de configuración. Esta rutina se llama cada vez que se hace referencia a la extensión en una operación de carga o descarga.

Para obtener más información sobre la rutina de configuración de extensión de kernel, consulte el tema de subrutina sysconfig . Sin embargo, PSE requiere lógica adicional para configurar correctamente una extensión.

Para establecer el enlace entre PSE y la extensión, la rutina de configuración de extensión debe llamar finalmente al programa de utilidad str_install . Este programa de utilidad realiza las operaciones internas necesarias para añadir o eliminar la extensión de las tablas internas de PSE.

El siguiente fragmento de código proporciona un ejemplo de una rutina de configuración mínima para un controlador denominado dgb. La lógica de inicialización y configuración específica del dispositivo se puede añadir según sea necesario. El punto de entrada dgb_config define e inicializa la estructura strconf_t que necesita el programa de utilidad str_install . En este ejemplo, la operación dgb_config recupera el argumento al que apunta el parámetro uiop y lo utiliza como ejemplo de uso. Una extensión puede ignorar el argumento. El número principal es necesario para los controladores y se recupera del parámetro dev . Puesto que el controlador dgb no requiere ninguna inicialización, su último paso es realizar la operación indicada llamando al programa de utilidad str_install . Es posible que otros controladores necesiten realizar otros pasos de inicialización antes o después de llamar al programa de utilidad str_install .


#include <sys/device.h>          /* for the CFG_* constants */
#include <sys/strconf.h>         /* for the STR_* constants */
dgb_config(dev, cmd, uiop)
      dev_t dev;
      int cmd;
      struct uio *uiop;
{
      char buf[FMNAMESZ+1];
      static strconf_t conf = {
                "dgb", &dgbinfo, STR_NEW_OPEN,
      };
      if (uiomove(buf, sizeof buf, UIO_WRITE, uiop))
                return EFAULT;
      buf[FMNAMESZ] = 0;
      conf.sc_name = buf;
      conf.sc_major = major(dev);
      switch (cmd) {
      case CFG_INIT:  return str_install(STR_LOAD_DEV, &conf);
      case CFG_TERM:  return str_install(STR_UNLOAD_DEV, &conf);
      default:   return EINVAL;
      }
}
Una rutina de configuración de módulo es similar a la rutina de controlador, excepto que no es necesario un número mayor y el convenio de llamada es ligeramente diferente. El siguiente fragmento de código proporciona un ejemplo de una rutina de configuración mínima completa:

#include <sys/device.h>
#include <sys/strconf.h>
/* ARGSUSED */
aoot_config(cmd, uiop)
       int cmd;
       struct uio *uiop;
{
       static strconf_t conf = {
               "aoot", &aootinfo, STR_NEW_OPEN,
       };
       /* uiop ignored */
       switch (cmd) {
       case CFG_INIT:  return str_install(STR_LOAD_MOD, &conf);
       case CFG_TERM:  return str_install(STR_UNLOAD_MOD, &conf);
       default:        return EINVAL;
       }
}
Para que el mandato strload instale correctamente una extensión, la rutina de configuración de cada extensión debe estar marcada como punto de entrada. Suponiendo que la extensión existe en un archivo denominado dgb.cy tiene una rutina de configuración denominada dgb_config, se puede crear un objeto PSE denominado dgb mediante los mandatos siguientes:

cc -c dgb.c
ld -o dgb dgb.o -edgb_config -bimport:/lib/pse.exp -lcsys
Una extensión de controlador creada de esta forma se puede instalar con el mandato siguiente:

strload -d dgb
y eliminados con el mandato siguiente:

strload -u -d dgb