Dados gerais

Interface: UserSpaceManager
Arquivos: userspacemanager.h
Última atualização: 08/06/2003
Autor: Luiz Henrique Shigunov
Informações

Descrição
Estruturas
Configuração
Funções para o sistema

0x0a - Brk - Define o ponto final da heap
0x00 - CopyFromUser - Copia dados da área de memória do usuário
0x01 - CopyToUser - Copia dados para a área de memória do usuário
0x02 - Exit - Finaliza um programa
0x03 - MapStackPages - Mapeia as páginas de argumento de um programa

0x04 - RegisterLoader - Registra um carregador de arquivo executável
0x05 - Run - Executa um programa
0x06 - StrLen - Obtém o tamanho de uma string na área de memória do usuário
0x07 - StrNCopy - Copia uma string da área de memória do usuário
0x08 - UnregisterLoader - Retira do registro um carregador de arquivo executável
Funções para o usuário

0x0b - UBrk - Define o ponto final da heap

0x09 - URun - Executa um programa

Descrição

Esta página descreve a interface UserSpaceManager que trata da área de memória do usuário, executa programas e é responsável por iniciar o primeiro programa.

O módulo que implementar esta interface deve gerar os eventos definidos na interface UserSpaceManagerE.

Estruturas

typedef struct {
    unsigned int exitType;
    unsigned int exitCode;
} UserSpaceManager_ExitInfo;

Esta estrutura é usada no evento TaskDestroyed da interface UserSpaceManagerE para informar porque a tarefa foi destruída.

exitType pode ser:

exitCode é o código de retorno da tarefa quando exitType for UserSpaceManager_TASK_EXITED ou tem estes valores se for UserSpaceManager_TASK_DUMPED:

typedef struct {
    FSManager_Handle *fd;
    char fileBuf[128];
    unsigned int stackTop;
    unsigned int argc;
    unsigned int envc;
    unsigned int exec;
    unsigned int stackSize;
    unsigned int startBrk;
} UserSpaceManager_ExecInfo;

Esta estrutura é utiliza pelos módulos que implementam a interface ExecLoader.

fd é o descritor do executável e fileBuf contém os primeiros 128 bytes do executável para permitir a sua identificação.

stackTop contém o topo da pilha, argc o número de argumentos na pilha e envc o número de variáveis de ambiente na pilha.

exec aponta para o caminho do executável e stackSize tem o tamanho em bytes da pilha com os argumentos.

startBrk deve ser definido para o começo da heap da tarefa e deve ser múltiplo de 0x1000.

stackTop e exec somente apontam para a pilha na área de memória do usuário depois que a função MapStackPages for chamada.

Configuração

Esta interface define os seguintes grupos e chaves disponíveis através da interface CfgManager:

/system/UserSpaceManager/init

Este grupo contém informações sobre o primeiro programa a ser executado e tem as seguintes chaves:

  • path - caminho completo até o programa

Por exemplo: path = /exec/shell.mod

/system/UserSpaceManager/init/input

As implementações da interface InputDev que devem ser registradas como dispositivos de entrada para o primeiro programa ficam neste grupo. Cada implementação tem um grupo dentro desse grupo que tem as seguintes chaves:

  • imp - nome da implementação da interface InputDev

Por exemplo:
Grupo /system/UserSpaceManager/init/input/keyboard, chaves:

  • imp = MF2KBD
/system/UserSpaceManager/init/output

As implementações da interface OutputDev que devem ser registradas como dispositivos de saída para o primeiro programa ficam neste grupo. Cada implementação tem um grupo dentro desse grupo que tem as seguintes chaves:

  • imp - nome da implementação da interface OutputDev

Por exemplo:
Grupo /system/UserSpaceManager/init/output/video, chaves:

  • imp = AT
/system/UserSpaceManager/loader

Neste grupo ficam os módulos responsáveis por carregar arquivos executáveis. Cada módulo deve ter um grupo com as seguintes chaves:

  • imp - nome da implementação da interface ExecLoader

Alguns exemplos:
Grupo /system/UserSpaceManager/loader/execmod, chaves:

  • imp = ExecMod

Grupo /system/UserSpaceManager/loader/elf, chaves:
  • imp = ELF

Funções para o sistema

Estas funções são de uso exclusivo dos módulos do sistema.

0x0a - Brk

Sintaxe

void *UserSpaceManager_Brk(void *addr);

Propriedades

Descrição

Esta função define o ponto final da heap para addr.

Com isso, a área até addr, não incluindo addr, pode ser usada pela tarefa.

addr é arredondado para cima para uma página do sistema (4096 bytes).

Se não for possível mudar, a função retorna o valor antigo.

Valor de retorno

O ponteiro para o ponto final da heap.

0x00 - CopyFromUser

Sintaxe

int UserSpaceManager_CopyFromUser(void *dst, const void *src, unsigned int size);

Propriedades

Descrição

Esta função copia size bytes de src para dst.

src deve estar dentro da área de memória do usuário.

Valor de retorno

0x01 - CopyToUser

Sintaxe

int UserSpaceManager_CopyToUser(void *dst, const void *src, unsigned int size);

Propriedades

Descrição

Esta função copia size bytes de src para dst.

dst deve estar dentro da área de memória do usuário.

Valor de retorno

0x02 - Exit

Sintaxe

int UserSpaceManager_Exit(TaskManager_Task *task, unsigned int exitType, unsigned int exitCode);

Propriedades

Descrição

Esta função finaliza a tarefa task com o tipo de retorno exitType e o código de retorno exitCode veja UserSpaceManager_ExitInfo.

Se task for NULL, finaliza a tarefa chamadora.

task tem que estar marcada indestrutível.

Lembre-se que uma tarefa executando código do sistema já está marcada indestrutível, ou seja, se task for NULL você não precisa chamar a função UndestroyableThread e se task não for NULL ela já está marcada indestrutível ou você não poderia usar task.

Valor de retorno

0x03 - MapStackPages

Sintaxe

int UserSpaceManager_MapStackPages(UserSpaceManager_ExecInfo *exec, char *stack, unsigned int size);

Propriedades

Descrição

Esta função mapeia as páginas de argumento do programa na tarefa chamadora.

As páginas são mapeadas em stack que tem tamanho size bytes.

stack deve ter sido alocada usando a função AllocUserPages.

Esta função é usada pelos módulos que implementam a interface ExecLoader para permitir o acesso aos argumentos passados para o programa.

stack tem que ser grande o suficiente para mapear todas páginas de argumento, ou seja, deve ter pelo menos o tamanho definido no campo stackSize de exec.

Valor de retorno

0x04 - RegisterLoader

Sintaxe

int UserSpaceManager_RegisterLoader(const char *imp, int prop);

Propriedades

Descrição

Esta função registra o carregador de arquivo executável que possui o nome da implementação imp da interface ExecLoader.

prop deve ser 0 ou:

Valor de retorno

0x05 - Run

Sintaxe

int UserSpaceManager_Run(const char *pathname, char *const argv[], char *const envp[], int prop, TaskManager_Task **task, TaskManager_Thread **thread);

Propriedades

Descrição

Esta função executa o programa pathname.

argv é um vetor de parâmetros para o programa e envp é um vetor de strings, no formato chave=valor, que é passado para o programa como variáveis de ambiente. Tanto argv quanto envp devem ser diferente de NULL e terminar com um ponteiro NULL.

prop deve ser 0 ou:

Em caso de sucesso, task conterá a referência para a tarefa e thread para a linha de execução e thread estará marcada indestrutível. É responsabilidade de quem chama marca-la destrutível.

Valor de retorno

0x06 - StrLen

Sintaxe

int UserSpaceManager_StrLen(const char *str, unsigned int *size);

Propriedades

Descrição

Esta função obtém o tamanho da string str e coloca em size o tamanho da string sem o '\0' final.

str deve estar dentro da área de memória do usuário.

Valor de retorno

0x07 - StrNCopy

Sintaxe

int UserSpaceManager_StrNCopy(char *dst, const char *str, unsigned int n, unsigned int *size);

Propriedades

Descrição

Esta função copia no máximo n bytes da string str em dst e coloca em size o tamanho da string copiada sem o '\0' final.

A cópia termina se o fim da string for encontrado.

str deve estar dentro da área de memória do usuário.

Valor de retorno

0x08 - UnregisterLoader

Sintaxe

int UserSpaceManager_UnregisterLoader(const char *imp, int prop);

Propriedades

Descrição

Esta função retira do registro o carregador de arquivo executável que possui o nome da implementação imp da interface ExecLoader.

prop deve ser 0 ou:

Só pode ser retirado um carregador que não esteja em uso.

Valor de retorno

Funções para o usuário

Estas funções foram projetadas para os módulos do usuário.

0x0b - UBrk

Sintaxe

void *UserSpaceManager_UBrk(void *addr);

Propriedades

Do usuário

Descrição

Esta função define o ponto final da heap para addr.

Com isso, a área até addr, não incluindo addr, pode ser usada pela tarefa.

addr é arredondado para cima para uma página do sistema (4096 bytes).

Se não for possível mudar, a função retorna o valor antigo.

Valor de retorno

O ponteiro para o ponto final da heap.

0x09 - URun

Sintaxe

int UserSpaceManager_URun(const char *pathname, char *const argv[], char *const envp[]);

Propriedades

Do usuário

Descrição

Esta função executa o programa pathname.

O programa vai começar a executar imediatamente.

argv é um vetor de parâmetros para o programa e envp é um vetor de strings, no formato chave=valor, que é passado para o programa como variáveis de ambiente. Tanto argv quanto envp devem ser diferente de NULL e terminar com um ponteiro NULL.

Valor de retorno