Manual de programación de OS/2/Llamadas DOSxxx para gestión de memoria

DosAllocMem editar

DosAllocMem reserva y asigna un bloque de memoria privada en el espacio de direcciones de la aplicación.

#define INCL_BASE
#include <os2.h>
PPVOID    pBaseAddress;
ULONG   ulObjectSize;
ULONG    ulAllocationFlags;
APIRET    rc;   /* Codigo de error */
rc = DosAllocMem(pBaseAddress, ulObjectSize, ulAllocationFlags);

Parámetros editar

pBaseAddress Un puntero a una variable donde OS/2 devolverá un puntero a la dirección base del bloque de memoria asignado.
ulObjectSize Un valor especificando el tamaño deseado (en bytes) del bloque de memoria. Este será redondeado por OS/2 al siguiente multiplo entero de páginas (de 4 kilobytes cada una).
ulAllocationFlags Un conjunto de flags que describen los atributos del bloque de memoria, así como los modos de acceso.
Atributos de posición
  • Si el bit PAG_COMMIT (0x00000010) está activo, el bloque de memoria es anotado pero no se reserva físicamente el bloque hasta que se produzca un acceso de lectura o de escritura en él.
  • Si el bit OBJ_TILE (0x00000040) está activo, el bloque de memoria será situado en los primeros 512 megabytes del espacio virtual de direcciones, con selectores de 16 bits. Estos bloques pueden ser usados para intercambiar datos con rutinas de 16 bits escritas para OS/2 1.x.

Atributos de protección

  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error editar

0 Sin error
8 No hay suficiente memoria
87 Parámetro no valido
95 Interrupción

DosAllocSharedMem editar

DosAllocSharedMem reserva y asigna un bloque de memoria compartida, que puede ser leido por varios procesos distintos.

#define INCL_BASE
#include <os2.h>
PPVOID    pBaseAddress;
PSZ    pszName;
ULONG    ulObjectSize;
ULONG    ulFlags;

APIRET    rc;   /* Codigo de error */
rc = DosAllocSharedMem(pBaseAddress, pszName, ulObjectSize, ulFlags);

Parámetros editar

pBaseAddress Un puntero a una variable donde OS/2 devolverá un puntero a la dirección base del bloque de memoria asignado.
pszName Un puntero opcional a una cadena asociada al bloque compartido. El nombre es una cadena ASCIIZ, en el formato de nombre de fichero de OS/2, en el directorio \SHAREMEM\; por ejemplo, \SHAREMEM\PUBLICO.DAT. Si no se indica ningún nombre (pszName=NULL), el bloque puede ser declarado giveable o getable para su compartición a traves de las funciones DosGetSharedMem o DosGiveSharedMem.
ulObjectSize Un valor especificando el tamaño deseado (en bytes) del bloque de memoria. Este será redondeado por OS/2 al siguiente multiplo entero de páginas (de 4 kilobytes cada una).
ulAllocationFlags Un conjunto de flags que describen los atributos del bloque de memoria, así como los modos de acceso.
Atributos de posición
  • Si el bit PAG_COMMIT (0x00000010) está activo, el bloque de memoria es anotado pero no se reserva físicamente el bloque hasta que se produzca un acceso de lectura o de escritura en él.
  • Si el bit OBJ_GIVEABLE (0x00000200) está activo, el acceso al bloque de memoria puede ser dado a otro proceso con la función DosGiveSharedMem.
  • Si el bit OBJ_GETTABLE (0x00000100) está activo, el bloque de memoria puede ser accedido por otro proceso que conozca la dirección base del bloque, a través de la función DosGetSharedMem.
  • Si el bit OBJ_TILE (0x00000040) está activo, el bloque de memoria será situado en los primeros 512 megabytes del espacio virtual de direcciones, con selectores de 16 bits. Estos bloques pueden ser usados para intercambiar datos con rutinas de 16 bits escritas para OS/2 1.x.

Atributos de protección

  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error editar

0 Sin error
8 No hay suficiente memoria
87 Parámetro no valido
95 Interrupción
123 Nombre no válido
183 Ya existe

DosFreeMem editar

DosFreeMem libera un bloque de memoria reservado por DosAllocMem o DosAllocSharedMem. En éste último caso, se decrementa el contador de accesos al bloque. Cuando éste ha llegado a cero, es que todos los procesos han liberado el bloque, momento en que la eliminación fisica se hace efectiva.

#define INCL_BASE
#include <os2.h>
PVOID    pBaseAddress;
APIRET    rc;   /* Codigo de error */
rc = DosFreeMem(pBaseAddress);

Parámetros editar

pBaseAddress La dirección base del bloque de memoria a liberar, obtenida con DosAllocMem o con DosAllocSharedMem.

Codigos de error editar

0 Sin error
5 Acceso denegado
95 Interrupción
487 Dirección no válida

DosGetNamedSharedMem editar

DosGetNamedSharedMem da acceso a un bloque de memoria compartido creado por otro proceso. Se usa sólo con bloques que tienen nombre.

#define INCL_BASE
#include <os2.h>
PPVOID    pBaseAddress;
PSZ    pszSharedMemName;
ULONG    ulAttributeFlags;
APIRET    rc;   /* Codigo de error */
rc = DosGetNamedSharedMem(pBaseAddress, pszSharedMemName, ulAttributeFlags);

Parámetros editar

pBaseAddress Puntero a una dirección donde OS/2 almacenará un puntero al inicio del bloque de memoria compartido.
pszSharedMemName Un puntero a una cadena ASCIIZ conteniendo el nombre del bloque de memoria que el otro proceso usó al crearlo. Debe incluir el nombre \SHAREMEM\ antes. Por ejemplo, \SHAREMEM\PUBLICO.DAT.
ulAllocationFlags Un conjunto de flags que describen los modos de acceso al bloque de memoria.
Atributos de protección
  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error editar

0 Sin error
2 Fichero no encontrado
8 No hay suficiente memoria
87 Parámetro no valido
95 Interrupción
123 Nombre no válido
212 Bloqueado

DosGetSharedMem editar

DosGetSharedMem da acceso a un bloque de memoria compartido creado por otro proceso. Es necesario conocer el puntero base de dicho bloque de memoria, el cual puede ser obtenido a través de sistemas de comunicación interproceso.

#define INCL_BASE
#include <os2.h>

PVOID    pBaseAddress;
ULONG    ulAttributeFlags;
APIRET   rc;   /* Codigo de error */
rc = DosGetSharedMem(pBaseAddress, ulAttributeFlags);

Parámetros editar

pBaseAddress Puntero al inicio del bloque de memoria compartido al que se quiere obtener acceso. Este puntero puede ser obtenido a través de los sistemas de comunicación interproceso.Además, dicho bloque debe ser gettable (esto es, haber sido creado con el atributo OBJ_GETTABLE).
ulAllocationFlags Un conjunto de flags que describen los modos de acceso al bloque de memoria.
Atributos de protección
  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error editar

0 Sin error
5 Acceso denegado
8 No hay suficiente memoria
87 Parámetro no valido
95 Interrupción
212 Bloqueado

DosGiveSharedMem editar

DosGiveSharedMem da acceso a un bloque de memoria compartido del proceso actual a otro proceso. Es similar a DosGetSharedMem, y también es necesario que los procesos intercambien el puntero al inicio del bloque por medio de los sistemas de comunicación interproceso.

#define INCL_BASE
#include <os2.h>
PVOID    pBaseAddress;
PID    idProccessID;
ULONG    ulAttributeFlags;
APIRET    rc;   /* Codigo de error */
rc = DosGiveSharedMem(pBaseAddress, idProccessID, ulAttributeFlags);

Parámetros editar

pBaseAddress Puntero al inicio del bloque de memoria compartido al que se quiere dar acceso a otro proceso, tal y como lo devuelve DosAllocSharedMem. Además, dicho bloque debe ser giveable (esto es, haber sido creado con el atributo OBJ_GIVEABLE).
idProcessID El identificador (PID) del proceso que recibirá acceso al bloque de memoria.
ulAllocationFlags Un conjunto de flags que describen los modos de acceso al bloque de memoria.
Atributos de protección
  • Si el bit PAG_EXECUTE (0x00000004) está activo, las páginas tendrán permiso de execución.
  • Si el bit PAG_READ (0x00000001) está activo, se permite la lectura de datos.
  • Si el bit PAG_WRITE (0x00000002) está activo, se permite la escritura de datos.
Al menos uno de los bits PAG_READ, PAG_WRITE o PAG_EXECUTE tiene que estar activo. El resto de los bits tienen que estar inactivos. En el procesador 386, el acceso de ejecución y lectura son equivalentes. Además, el acceso de escritura implica escritura y lectura.

Codigos de error editar

0 Sin error
5 Acceso denegado
8 No hay suficiente memoria
87 Parámetro no valido
95 Interrupción
212 Bloqueado
303 PID no válido
487 Dirección no válida


DosSubAllocMem editar

DosSubAllocMem asigna un subbloque de memoria en un bloque previamente inicializado por DosSubSetMem.

#define INCL_BASE
#include <os2.h>
PVOID    pOffset;
PPVOID    pBlockOffset;
ULONG    ulSize;
APIRET    rc;   /* Codigo de error */
rc = DosSubAllocMem(pOffset, pBlockOffset, ulSize);

Parámetros editar

pOffset Puntero al bloque de memoria en donde se va a asignar el subbloque.
pBlockOffset Puntero a una zona de memoria donde OS/2 devolverá un puntero al inicio del subbloque.
ulSize Tamaño en bytes del subbloque que se quiere crear. Este valor será redondeado al múltiplo superior de 8 más cercano. El tamaño máximo es el del bloque inicializado con DosSubSetMem menos 64 bytes.

Codigos de error editar

0 Sin error
87 Parámetro no válido
311 No hay suficiente memoria libre
532 DosSub corrupto


DosSubFreeMem editar

DosSubFreeMem libera un subbloque de memoria previamente asignado con DosSubAllocMem.

#define INCL_BASE
#include <os2.h>
PVOID pOffset;
PVOID    pBlockOffset;
ULONG    ulSize;
APIRET    rc;   /* Codigo de error */
rc = DosSubFreeMem(pOffset, pBlockOffset, ulSize);

Parámetros editar

pOffset Puntero al bloque de memoria en donde se encuentra el subbloque a liberar.
pBlockOffset El puntero del subbloque a liberar. Tiene que ser un valor entregado por DosSubAllocMem.
ulSize Tamaño en bytes del subbloque a liberar. Este valor será redondeado al múltiplo superior de 8 más cercano. El tamaño máximo es el del bloque inicializado con DosSubSetMem menos 64 bytes.

Codigos de error editar

0 Sin error
87 Parámetro no válido
312 Superposición no válida en el bloque
532 DosSub corrupto


DosSubSetMem editar

DosSubSetMem inicializa un bloque de memoria para subasignación, o incrementa el tamaño de un bloque previamente inicializado.

#define INCL_BASE
#include <os2.h>
PVOID    pOffset;
ULONG    ulFlags;
ULONG    ulSize;
APIRET    rc;   /* Codigo de error */
rc = DosSubSetMem(pOffset, ulFlags, ulSize);

Parámetros editar

pOffset Puntero al bloque de memoria que se quiere usar para subasignación.
ulFlags Flags que describen las características del bloque de memoria que será subasignado.
Bit 0 DOSSUB_INIT: Si este bit está a 1, el bloque de memoria será inicializado para subasignación. Si es cero, se supone que el bloque ya está inicializado y se quiere obtener acceso a un bloque de memoria compartido.
Bit 1 DOSSUB_GROW: Si este bit está a 1, la petición es para incrementar el tamaño de un bloque ya inicializado. Si es cero, no indica nada.
Bit 2 DOSSUB_SPARSE_OBJ: Este bit debe estar a cero.
Bit 3 DOSSUB_SERIALIZE: Este bit está a 1 si se quiere un acceso serializado a la memoria. En una petición de aumento de tamaño, este valor tiene que ser el mismo que se dio en la creación, o si no OS/2 devolverá un error.
ulSize El tamaño en bytes del subbloque que se reservará para subasignación. Si no es un multiplo de 8 bytes, se redondeará por debajo a un múltiplo.

Codigos de error editar

0 Sin error
87 Parámetro no válido
310 No se puede reducir un segmento subasignado


DosSubUnsetMem editar

DosSubUnsetMem libera un bloque de memoria destinado a subasignación. Es necesario hacerlo antes de liberar el bloque físico con DosFreeMem.

#define INCL_BASE
#include <os2.h>
PVOID    pOffset;
APIRET    rc;   /* Codigo de error */
rc = DosSubUnsetMem(pOffset);

Parámetros editar

pOffset Un puntero al bloque de memoria que se quiere liberar.

Codigos de error editar

0 Sin error
532 DosSub corrupto