Servicio de kernel dmp_ctl
Finalidad
Añade y elimina entradas en la tabla de vuelco maestro.
Sintaxis
#include <sys/types.h>
#include <errno.h>
#include <sys/dump.h>
int dmp_ctl(op, parmp)
int op;
struct dmpctl_data *parmp;Descripción
- Las rutinas se invocan de forma diferente a las rutinas añadidas con el servicio de kernel de dmp_add . Las rutinas añadidas utilizando el servicio de kernel de dmp_ctl devuelven un puntero vacío, a una tabla de volcado o a una estimación de tamaño de vuelco.
- Se espera que las rutinas añadidas con el servicio de kernel de dmp_ctl ignoren las funciones que no soportan. Por ejemplo, no deben atrapar si reciben una solicitud no reconocida. Esto permite que la funcionalidad futura se añada sin que todos los usuarios tengan que cambiar.
El servicio de kernel de dmp_ctl se utiliza para solicitar que se deje de lado una cantidad de memoria en un almacenamiento intermedio global. A continuación, la rutina utilizará la rutina para almacenar datos no residentes en la memoria. Un ejemplo de estos datos son los datos de vuelco proporcionados por un adaptador. Sin un almacenamiento intermedio global, los datos tendrían que colocarse en un almacenamiento intermedio fijo asignado en el momento de la configuración. Cada componente necesitaría asignar su propio almacenamiento intermedio fijo.
El recurso de vuelco del sistema mantiene un almacenamiento intermedio global para dichos datos. Este almacenamiento intermedio se asigna cuando se solicita por primera vez, con el tamaño solicitado. Otra rutina de volcado que solicita más datos hace que el almacenamiento intermedio se reasigne con el tamaño mayor. Dado que este almacenamiento intermedio debe mantenerse en el almacenamiento fijo para la vida del sistema, sólo solicite la cantidad de memoria necesaria. Solicitar una cantidad excesiva de almacenamiento comprometerá el rendimiento del sistema reservando demasiado almacenamiento fijo.
Cualquier rutina de volcado que utilice el almacenamiento intermedio global se llama siempre que se necesitan datos de vuelco. Las rutinas sólo se llaman una vez para proporcionar dichos datos. Sus direcciones de tabla de volcado se guardan y se utilizan si se reinicia el vuelco.
Tablas de volcado
Una rutina de volcado devuelve una tabla de volcado de componentes que empieza por DMP_MAGIC, que es el número mágico para la tabla de vuelco de 32 o 64 bits. Si se utiliza la tabla de vuelco de tamaño ilimitado, el número mágico es DMP_MAGIC_U y se utiliza la estructura cdt_u . Si este es el caso, la rutina de vuelco se llama repetidamente hasta que devuelve un puntero cdt_u nulo. La finalidad de la tabla de vuelco de tamaño ilimitado es proporcionar una forma de volcar un número desconocido de áreas de datos sin tener que preasignar la mayor matriz posible de elementos cdt_entry como es necesario para la tabla de volcado clásico. Las definiciones de las tablas de volcado se encuentran en el archivo de inclusión sys/dump.h .
Parámetros
Las operaciones dmp_ctl y la estructura dmpctl_data se definen en el archivo de texto dump.h .
| Elemento | Descripción |
|---|---|
| op | Especifica la operación que ha de realizarse. |
| parmp | Apunta a una estructura dmpctl_data que contiene valores para la operación especificada. La estructura dmpctl_data se define en el archivo /usr/include/sys/dump.h de la siguiente manera: |
Las operaciones soportadas y sus datos asociados son:
| Elemento | Descripción |
|---|---|
| DMPCTL_ADD | Añade la rutina de vuelco especificada a la tabla de vuelco maestro. Esto requiere un puntero a los distintivos de función y tipo de función. Los distintivos de tipo soportados son:
|
| DMPCTL_DEL | Suprime la función de vuelco especificada de la tabla de vuelco maestro. |
| DMPCTL_RTNFAILURE | Informa de una incapacidad para volcar los datos necesarios. La rutina debe configurar dmpc_func,dmpcf_rV, campos dmpcf_vaddr y dmpcf_handle. |
Parámetros de invocación de función de vuelco:
| Elemento | Descripción |
|---|---|
| código de operación | Especifica la operación que debe realizar la rutina. Los códigos de operación son:
|
| puntero del almacenamiento | Es un puntero al almacenamiento intermedio global, o NULL si no se ha solicitado ningún espacio de almacenamiento intermedio global. |
Valores de retorno
| Elemento | Descripción |
|---|---|
| 0 | Se devuelve si es satisfactorio. |
| EINVAL | Se devuelve si uno o más valores de parámetro no son válidos. |
| ENOMEM | Se devuelve si la solicitud de almacenamiento intermedio global no se puede satisfacer. |
| EEXIST | Se devuelve si la función de vuelco ya se ha añadido. |
Ejemplos
- Para añadir una rutina de volcado (dmprtn) que se puede llamar una vez para proporcionar datos, escriba:
void *dmprtn(int op, void *buf); struct cdt cdt; dmp_sizeest_t estimate; config() { struct dmpctl_data parm; ... parm.dmpc_magic = DMPC_MAGIC1; parm.dmpc_func = dmprtn; parm.dmpc_flags = 0; ret = dmp_ctl(DMPCTL_ADD, &parm); ... } /* * Dump routine. * * input: * op - dump routine operation. * buf - NULL since no global buffer is used. * * returns: * A pointer to the component dump table. */ void * dmprtn(int op, void *buf) { void *ret; switch(op) { case DMPRTN_START: /* Provide dump data. */ ... ret = (void *)&cdt; break; case DMPRTN_ESTIMATE: ret = (void *)&estimate; break; default: break; } return(ret); } - Para añadir una rutina de volcado (dmprtn) que solicite 16 kb de espacio de almacenamiento intermedio global, escriba:
... #define BSIZ 16*1024 dmp_sizeest_t estimate; config() { ... parm.dmpc_magic = DMPC_MAGIC1; parm.dmpc_func = dmprtn; parm.dmpc_flags = DMPFUNC_CALL_ON_RESTART|DMPC_GLOBAL_BUFFER; parm.dmpc_bsize = BSIZ; ret = dmp_ctl(DMPCTL_ADD, &parm); ... } /* * Dump routine. * * input: * op - dump routine operation. * buf - points to the global buffer. * * output: * Return a pointer to the dump table or to the estimate. */ void * dmprtn(int op, void *buf) { void *ret; switch(op) { case DMPRTN_START: /* Provide dump data. */ ... (Put data in buffer at buf.) ret = (void *)&cdt; break; case DMPRTN_ESTIMATE: ret = (void *)&estimate; break; default: break; } return(ret); }