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;
}
}
#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;
}
}
cc -c dgb.c
ld -o dgb dgb.o -edgb_config -bimport:/lib/pse.exp -lcsys
strload -d dgb
strload -u -d dgb