Interface: MemManager Arquivos: memmanager.h Última atualização: 01/06/2003 Autor: Luiz Henrique Shigunov |
Descrição Estruturas |
Funções para o sistema | |
0x00 - Alloc - Aloca memória para os módulos do sistema 0x01 - AllocObj - Aloca objetos para os módulos do sistema 0x06 - AllocUserPages - Aloca páginas na área de memória do usuário 0x07 - AttachShMemory - Anexa uma memória compartilhada 0x02 - CreateObjCache - Cria um cache de determinados objetos 0x08 - CreateShMemory - Cria uma memória compartilhada 0x03 - DestroyObjCache - Destrói um cache de determinados objetos 0x09 - DestroyShMemory - Destrói uma memória compartilhada |
0x0a - DetachShMemory - Desanexa uma memória compartilhada 0x04 - Free - Libera memória alocada para os módulos do sistema 0x05 - FreeObj - Libera objetos alocada para os módulos do sistema 0x0b - FreeUserPages - Libera páginas na área de memória do usuário 0x0c - MapPageAtUserPage - Mapeia uma página física na área de memória do usuário 0x0d - ProtectShMemory - Muda as permissões de acesso de uma memória compartilhada 0x0e - SetUserPagesProt - Muda as permissões de acesso de páginas na área de memória do usuário |
Funções para o usuário | |
0x0f - UAllocUserPages - Aloca páginas na área de memória do usuário 0x10 - UFreeUserPages - Libera páginas na área de memória do usuário |
0x11 - USetUserPagesProt - Muda as permissões de acesso de páginas na área de memória do usuário |
Esta página descreve a interface MemManager, que disponibiliza serviços comuns à todas as arquiteturas.
O módulo que implementar esta interface deve gerar os eventos definidos na interface MemMEvent.
typedef struct { int (*readpage)(void *arg, void *page, unsigned int offset); } MemManager_ShMemFunctions;
A função readpage, se for diferente de NULL, é chamada quando uma página de memória tiver que ser lida. page é o endereço da página que deve ser lida e offset o deslocamento dessa página dentro da memória compartilhada. Ela deve retorna 0 em caso de sucesso e outro valor para erro. Em caso de erro a exceção de memória será gerada.
Estas funções são de uso exclusivo dos módulos do sistema.
void *MemManager_Alloc(unsigned int size, int prop);
Esta função aloca size bytes de memória com as propriedades prop.
size tem que ser diferente de 0.
prop deve ser 0 ou a soma de:
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
void *MemManager_AllocObj(MemManager_Cache *cache);
Esta função aloca um objeto do cache cache.
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
void *MemManager_AllocUserPages(void *start, unsigned int size, unsigned int align, int prop, TaskManager_Task *task);
Esta função aloca size bytes, que deve ser diferente de zero, de memória na área de memória do usuário para a tarefa task. O endereço start é apenas uma dica de onde alocar e, normalmente, é NULL. Se start for fornecido como dica, a busca por um lugar começa em start e vai para endereços mais baixos.
As páginas de memória alocadas são liberadas quando a tarefa é destruida.
start, size e align devem ser múltiplos de uma página de memória (4096 bytes).
Se task for NULL, será alocado na tarefa chamadora.
Se prop não tiver MemManager_FIXED_ADDR, as páginas serão alocadas num endereço alinhado em align. Se align for 0, será alinhado em uma página de memória.
Se prop não tiver MemManager_FAIL_MAPPED, qualquer mapeamento que existir na área a ser alocada será desmapeado.
prop deve ser a soma de:
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
void *MemManager_AttachShMemory(MemManager_ShMem *shmem, void *start, unsigned int offset, unsigned int size, int prop, TaskManager_Task *task);
Esta função anexa a memória compartilhada shmem no endereço start da tarefa task. O endereço start é apenas uma dica de onde anexar e, normalmente, é NULL. Se start for fornecido como dica, a busca por um lugar começa em start e vai para endereços mais baixos.
Se task for NULL, será anexado na tarefa chamadora.
size bytes, que deve ser diferente de zero, começando do deslocamento offset bytes dentro da memória compartilhada serão anexados.
start, size e offset devem ser múltiplos de uma página de memória (4096 bytes).
Se prop não tiver MemManager_FAIL_MAPPED, qualquer mapeamento que existir na área onde a anexação vai ocorrer será desmapeado.
prop deve ser a soma de:
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
MemManager_Cache *MemManager_CreateObjCache(unsigned int size, unsigned int align, int prop, void (*ctor)(void *obj, unsigned int size), void (*dtor)(void *obj, unsigned int size));
Esta função cria um cache de objetos. Um objeto é uma porção de memória que mantém o seu estado inicial entre chamadas às funções FreeObj e AllocObj. Ou seja, AllocObj obtém um objeto no estado inicial e FreeObj retorna para o cache um objeto também no estado inicial.
Com esse mecanismo, não precisamos iniciar um objeto sempre que a função AllocObj for chamada.
size, que deve ser diferente de 0, é o tamanho de cada objeto no cache, align o alinhamento, na forma de potência de 2 (1=2 bytes, 2=4 bytes, 3=8 bytes, ...), necessário para cada objeto (0 para ser o melhor para a máquina).
ctor e dtor, que podem ser NULL, são as funções que criam e destroem os objetos do cache respectivamente. Elas recebem o objeto obj a ser iniciado ou destruido e também o tamanho do objeto em size. Estas funções não podem alocar objetos do mesmo tipo que estão iniciando ou destruindo para evitar um laço infinito.
prop deve ser 0 ou a soma de:
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
MemManager_ShMem *MemManager_CreateShMemory(unsigned int size, int prop, const MemManager_ShMemFunctions *functions, void *arg);
Esta função cria uma memória compartilhada na área de memória do usuário com size bytes. size deve ser diferente de zero e múltiplo do tamanho da página do sistema (4096 bytes).
Numa memória compartilhada, as páginas de memória alocadas somente são liberadas quando a memória compartilhada é destruida, ou seja, a memória compartilhada pode continuar existindo mesmo que nenhuma tarefa esteja anexada.
functions é um vetor de funções que são chamadas em determinadas ocasiões e arg é um parâmetro que é passado para essas funções. functions não pode ser NULL e tem que existir enquanto a memória compartilhada não for destruida.
prop deve ser 0 ou a soma de:
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
int MemManager_DestroyObjCache(MemManager_Cache *cache);
Esta função destrói o cache de objetos cache, que deve ser diferente de NULL.
Todos os objetos do cache devem ter sido liberados pela função FreeObj.
int MemManager_DestroyShMemory(MemManager_ShMem *shmem);
Esta função destrói a memória compartilhada shmem, que deve ser diferente de NULL.
Todas as páginas de memória alocadas serão liberadas.
Nenhuma tarefa pode estar com shmem anexada.
int MemManager_DetachShMemory(MemManager_ShMem *shmem, void *start, unsigned int size, int prop, TaskManager_Task *task);
Esta função desanexa a memória compartilhada shmem começando do endereço start e tamanho size bytes, que deve ser diferente de zero, da tarefa task.
start e size devem ser múltiplos de uma página de memória (4096 bytes).
Se task for NULL será desanexada da tarefa chamadora.
prop deve ser 0 ou a soma de:
int MemManager_Free(void *ptr);
Esta função libera a memória ptr.
int MemManager_FreeObj(MemManager_Cache *cache, void *obj);
Esta função libera o objeto obj, que deve ser diferente de NULL, do cache cache.
O objeto deve estar no seu estado inicial, ou seja, no estado logo após ser construido.
int MemManager_FreeUserPages(void *start, unsigned int size, int prop, TaskManager_Task *task);
Esta função libera size bytes, que deve ser diferente de zero, de páginas de memória começando em start da tarefa task.
start e size devem ser múltiplos de uma página de memória (4096 bytes).
Se task for NULL, será usado a tarefa que chamou a função.
prop deve ser 0 ou a soma de:
int MemManager_MapPageAtUserPage(void *logPage, unsigned int physPage, TaskManager_Task *task);
Esta função mapeia a página física physPage no endereço logPage da tarefa task.
physPage deve ser o endereço da página física (0x0, 0x1000, 0x2000, 0x24000, etc).
logPage deve estar dentro de uma área alocada com AllocUserPages e não pode estar mapeada numa página física.
Se task for NULL será usada a tarefa chamadora.
int MemManager_ProtectShMemory(MemManager_ShMem *shmem, const void *start, unsigned int size, int prop, TaskManager_Task *task);
Esta função muda as permissões de acesso das páginas de memória anexadas da memória compartilhada shmem começando do endereço start com tamanho size bytes, que deve ser diferente de zero, da tarefa task.
Se task for NULL será usada a tarefa chamadora.
prop deve ser a soma de:
int MemManager_SetUserPagesProt(const void *start, unsigned int size, int prop, TaskManager_Task *task);
Esta função muda as permissões de acesso das páginas de memória começando do endereço start com tamanho size bytes, que deve ser diferente de zero, da tarefa task.
start e size devem ser múltiplos de uma página de memória (4096 bytes).
Se task for NULL será usada a tarefa chamadora.
prop deve ser a soma de:
Estas funções foram projetadas para os módulos do usuário.
void *MemManager_UAllocUserPages(void *start, unsigned int size, unsigned int align, int prop);
Do usuário
Esta função aloca size bytes, que deve ser diferente de zero, começando em start para a tarefa.
Se prop não tiver MemManager_FIXED_ADDR, um endereço alinhado em align será escolhido.
start, size e align devem ser múltiplos do tamanho da página do sistema (4096 bytes).
Se align for 0, será alinhado em uma página.
prop deve ser a soma de:
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
int MemManager_UFreeUserPages(void *start, unsigned int size);
Do usuário
Esta função libera size bytes, que deve ser diferente de zero, de start em diante.
Essa área deve ter sido alocada com UAllocUserPages.
start e size devem ser múltiplos do tamanho da página do sistema (4096 bytes).
int MemManager_USetUserPagesProt(const void *start, unsigned int size, int prop);
Do usuário
Esta função muda as permissões de acesso das páginas de memória de start até start+size bytes - 1, inclusive.
start e size devem ser múltiplos de uma página de memória (4096 bytes).
size deve ser diferente de zero.
prop deve ser a soma de: