Dados gerais

Interface: MemManager_i386
Arquivos: memmanager_i386.h
Última atualização: 08/06/2005
Autor: Luiz Henrique Shigunov
Informações

Descrição
Estruturas
Funções

0x00 - AllocPages - Aloca páginas lógicas para os módulos do sistema
0x01 - AllocPhysPages - Aloca páginas físicas
0x02 - Block - Bloqueia memória
0x03 - Catch - Registra um tratador de exceção
0x04 - CreateDescriptor - Cria um descritor de sistema
0x05 - CreatePGD - Cria um mapeamento de memória lógica/física
0x06 - DestroyDescriptor - Destrói um descritor de sistema

0x07 - FreeException - Remove um tratador de exceção
0x08 - FreePages - Libera páginas lógicas alocadas para os módulos do sistema
0x09 - FreePhysPages - Libera páginas físicas
0x0a - MapPhysPages - Mapeia páginas físicas
0x0b - SetPagesProp - Modifica as propriedades das páginas lógicas
0x0c - Unblock - Desbloqueia memória

Descrição

Esta página descreve a interface MemManager_i386.

Na arquitetura Intel, o administrador de memória administra a memória lógica da área do sistema, a memória física do computador, a tabela de páginas, a GDT e as exceções relativas a memória.

A administração da memória lógica é dividida em administração das páginas de memória lógica e a administração da memória de tamanho arbitrário.

Módulos do sistema podem alocar, liberar e mudar as propriedades das páginas lógicas e físicas. Podem, também, bloquear algumas páginas de memória lógica (não permitindo que as páginas lógicas fiquem sem mapeamento físico) e desbloquear.

O administrador também oferece um serviço para mapear páginas físicas que não são disponíveis para uso (memória de video, e/s, etc).

O modelo de memória adotado é o não segmentado. Existem 2 segmentos de código (um para os módulos do sistema e outro para as tarefas) e um segmento de dados usado tanto para os módulo dos sistema quanto para as tarefas. Todos esses segmentos têm 4 GB de extensão, ou seja, todo o espaço de endereçamento da arquitetura IA32.

Cada tarefa tem um mapeamento de memória lógica (linear na linguagem da Intel) para física. Os primeiros 3,5 GB de memória lógica são disponíveis para as tarefas e os restantes 512 MB são reservados para os módulos do sistema.

Assim, a cada troca de tarefa um mapeamento de memória lógica para física é carregado. Mas, nas chamadas de sistema o mapeamento continua o mesmo.

Estruturas

typedef struct {
    unsigned short limit15; /* os 16 primeiros bits do limite do segmento */
    unsigned short base15;  /* os 16 primeiros bits da base do segmento */
    unsigned int
        base23  : 8,    /* mais 8 bits da base do segmento */
        type    : 4,    /* tipo do segmento */
        s       : 1,    /* indica se o segmento é de sistema */
        dpl     : 2,    /* nível de privilégio do segmento */
        p       : 1,    /* indica se o segmento está presente */
        limit19 : 4,    /* os últimos 4 bits do limite */
        avl     : 1,    /* disponível para o programador */
        reserved: 1,    /* reservado, deve ser 0 */
        db      : 1,    /* tamanho padrão dos dados */
        g       : 1,    /* granularidade do limite */
        base31  : 8;    /* os últimos 8 bits da base do segmento */
} MemManager_i386_SegDescriptor;

0x00 - AllocPages

Sintaxe

void *MemManager_i386_AllocPages(unsigned int n, int prop);

Propriedades

Descrição

Esta função aloca n páginas lógicas contínuas com as propriedades prop.

prop deve ser 0 ou a soma de:

Se prop tiver MemManager_i386_ALLOC_PHYS, as páginas físicas também serão alocadas e mapeadas nas páginas lógicas alocadas.

As páginas físicas, se forem alocadas, o serão sem propriedades especiais (bloqueada, contínuas, etc).

A propriedade MemManager_i386_CLEAR_PAGES só tem sentido quando a página física for alocada.

Valor de retorno

Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.

0x01 - AllocPhysPages

Sintaxe

unsigned int MemManager_i386_AllocPhysPages(unsigned int n, int prop);

Propriedades

Descrição

Esta função aloca n páginas físicas contínuas com as propriedades prop.

prop deve ser 0 ou a soma de:

Páginas físicas bloqueadas não saem da memória física (para implementar memória virtual).

As propriedades de 0x02-0x08 são usadas principalmente por dispositivos antigos.

Valor de retorno

Apesar do tipo do valor retornado não ser um ponteiro, o mesmo esquema de código de erro é utilizado.

Por isso, utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.

0x02 - Block

Sintaxe

int MemManager_i386_Block(void *ptr, unsigned int size);

Propriedades

Descrição

Esta função bloqueia as páginas contidas entre o endereço ptr e ptr + size.

size é o tamanho em bytes.

Se uma página for bloqueada n vezes, ela deve ser desbloqueada n vezes.

Valor de retorno

0x03 - Catch

Sintaxe

int MemManager_i386_Catch(void *start, void *end, void *function, int prop);

Propriedades

Descrição

Esta função registra o tratador function para receber as exceções de página (não presente ou falha de proteção).

Existem dois tipos de exceção de página. Um baseado em quem causou (código executável que causou a exceção independente do modo do processador) e outro baseado no modo do processador.

O tipo baseado em quem causou é usado normalmente para pegar erros que ocorrem quando executando código dos módulos do sistema (tentar acessar uma área de memória inválida, por exemplo).

Já o tipo baseado no modo do processador serve para pegar erros de programas (tentar executar alguma coisa na área do sistema, por exemplo) e ocorre quando o processador estiver no modo usuário independente do endereço onde a exceção ocorreu.

Quando uma exceção de página ocorre os tratadores baseado no modo do processador são chamados. Se nenhum tratador tratar a exceção, a lista baseada em quem causou é utilizada.

start e end são endereços e são usados se prop não tiver MemManager_i386_EX_USER_MODE.

A linha de execução que executar os tratadores pode estar destrutível. Se isso for problema as funções Undestroyable e Destroyable da interface TaskManager devem ser usadas.

prop deve ser 0 ou a soma de:

Se prop não tiver MemManager_i386_EX_USER_MODE, o tratador é chamado quando o endereço do código de quem causou a exceção estiver entre start-end, inclusive.

Se prop não tiver MemManager_i386_EX_RETURN, function deve ter a seguinte sintaxe:

    int meu_tratador(void *endereco, IntManager_i386_ExRegs *regs);

Onde endereco é o endereço onde a exceção ocorreu e regs são os valores dos registradores, mudar esses valores afeta a linha de execução quando do retorno. O membro EIP de regs tem o endereço do código onde ocorreu a exceção e ErrorCode tem o formato:

BitDescrição
00 - Ocorreu devido à página não presente;
1 - Ocorreu devido à violação de proteção.
10 - Ocorreu uma tentativa de leitura;
1 - Ocorreu uma tentativa de escrita.
20 - O processador estava em modo supervisor/sistema;
1 - O processador estava em modo usuário.

Ao retornar o tratador indica qual ação tomar:

Retornar E_HANDLED_INT indica que os outros tratadores não devem ser chamados, mas retornar E_UNHANDLED_INT indica para chamar.

Valor de retorno

0x04 - CreateDescriptor

Sintaxe

int MemManager_i386_CreateDescriptor(MemManager_i386_SegDescriptor descriptor, unsigned short *selector);

Propriedades

Descrição

Esta função vai colocar o descritor descriptor na GDT e retornar em selector o número do seletor alocado.

O descritor tem que seguir o formato especificado em SegDescriptor.

Valor de retorno

0x05 - CreatePGD

Sintaxe

unsigned int MemManager_i386_CreatePGD(void);

Propriedades

Descrição

Esta função cria um mapeamento de memória lógica para física.

Quando a PGD é criada, as PDEs relativas aos módulos do sistema são iniciadas e o restante das PDEs são preenchidas com zero.

Para liberar a PGD basta chamar FreePhysPages com o endereço e quantidade 1.

Valor de retorno

Apesar do tipo do valor retornado não ser um ponteiro, o mesmo esquema de código de erro é utilizado.

Por isso, utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.

0x06 - DestroyDescriptor

Sintaxe

int MemManager_i386_DestroyDescriptor(unsigned int selector);

Propriedades

Descrição

Esta função destrói o descritor identificado por selector.

Valor de retorno

0x07 - FreeException

Sintaxe

int MemManager_i386_FreeException(void *start, void *function, int prop);

Propriedades

Descrição

Esta função retira a função function para tratar a exceção de página que ocorrer em start.

prop deve ser 0 ou a soma de:

Valor de retorno

0x08 - FreePages

Sintaxe

int MemManager_i386_FreePages(void *pages, unsigned int n, int prop);

Propriedades

Descrição

Esta função libera n páginas lógicas alocadas para os módulos do sistema de pages em diante.

prop deve ser 0 ou a soma de:

Valor de retorno

0x09 - FreePhysPages

Sintaxe

int MemManager_i386_FreePhysPages(unsigned int pages, unsigned int n);

Propriedades

Descrição

Esta função libera n páginas físicas, que deve ser diferente de 0, de pages em diante. Por exemplo, pages poderia ser 0, 0x1000, 0x2000, 0x3000, etc.

Valor de retorno

0x0a - MapPhysPages

Sintaxe

void *MemManager_i386_MapPhysPages(void *to, unsigned int start, unsigned int n, int prop);

Propriedades

Descrição

Esta função mapeia n páginas físicas, que deve ser diferente de 0, de start em diante na memória lógica to, definindo as propriedades das páginas lógicas to para prop.

start deve ser o endereço da página física. Por exemplo: 0, 0x1000, 0x2000, 0x3000, etc.

Se prop tiver MemManager_i386_ALLOC_PAGES, to não será usado.

Se prop não tiver MemManager_i386_ALLOC_PAGES, to deve estar dentro da área de memória do sistema e ter sido alocado usando a função AllocPages.

prop deve ser 0 ou a soma de:

Valor de retorno

Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.

0x0b - SetPagesProp

Sintaxe

int MemManager_i386_SetPagesProp(void *start, unsigned int n, int prop);

Propriedades

Descrição

Esta função modifica as propriedades das n primeiras páginas lógicas do sistema do endereço lógico start em diante para prop.

As páginas lógicas devem ter sido alocados pela função AllocPages.

prop deve ser 0 ou a soma de:

Valor de retorno

0x0c - Unblock

Sintaxe

int MemManager_i386_Unblock(void *ptr, unsigned int size);

Propriedades

Descrição

Esta função desbloqueia as páginas contidas entre o endereço ptr e ptr + size.

size é o tamanho em bytes.

Se uma página for bloqueada n vezes, ela deve ser desbloqueada n vezes.

Valor de retorno