Interface: MemManager_i386 Arquivos: memmanager_i386.h Última atualização: 08/06/2005 Autor: Luiz Henrique Shigunov |
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 |
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.
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;
void *MemManager_i386_AllocPages(unsigned int n, int prop);
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.
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
unsigned int MemManager_i386_AllocPhysPages(unsigned int n, int prop);
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.
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.
int MemManager_i386_Block(void *ptr, unsigned int size);
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.
int MemManager_i386_Catch(void *start, void *end, void *function, int prop);
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:
Bit | Descrição |
---|---|
0 | 0 - Ocorreu devido à página não presente; 1 - Ocorreu devido à violação de proteção. |
1 | 0 - Ocorreu uma tentativa de leitura; 1 - Ocorreu uma tentativa de escrita. |
2 | 0 - 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.
int MemManager_i386_CreateDescriptor(MemManager_i386_SegDescriptor descriptor, unsigned short *selector);
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.
unsigned int MemManager_i386_CreatePGD(void);
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.
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.
int MemManager_i386_DestroyDescriptor(unsigned int selector);
Esta função destrói o descritor identificado por selector.
int MemManager_i386_FreeException(void *start, void *function, int prop);
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:
int MemManager_i386_FreePages(void *pages, unsigned int n, int prop);
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:
int MemManager_i386_FreePhysPages(unsigned int pages, unsigned int n);
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.
void *MemManager_i386_MapPhysPages(void *to, unsigned int start, unsigned int n, int prop);
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:
Utilize as macros IS_PTR_ERROR e PTR_TO_ERROR para saber se ocorreu erro e para obter o erro respectivamente.
int MemManager_i386_SetPagesProp(void *start, unsigned int n, int prop);
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:
int MemManager_i386_Unblock(void *ptr, unsigned int size);
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.