Interface: UserSpaceManager Arquivos: userspacemanager.h Última atualização: 08/06/2003 Autor: Luiz Henrique Shigunov |
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 |
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.
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.
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:
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:
Por exemplo:
| ||
/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:
Por exemplo:
| ||
/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:
Alguns exemplos:
Grupo /system/UserSpaceManager/loader/elf, chaves:
|
Estas funções são de uso exclusivo dos módulos do sistema.
void *UserSpaceManager_Brk(void *addr);
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.
O ponteiro para o ponto final da heap.
int UserSpaceManager_CopyFromUser(void *dst, const void *src, unsigned int size);
Esta função copia size bytes de src para dst.
src deve estar dentro da área de memória do usuário.
int UserSpaceManager_CopyToUser(void *dst, const void *src, unsigned int size);
Esta função copia size bytes de src para dst.
dst deve estar dentro da área de memória do usuário.
int UserSpaceManager_Exit(TaskManager_Task *task, unsigned int exitType, unsigned int exitCode);
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.
int UserSpaceManager_MapStackPages(UserSpaceManager_ExecInfo *exec, char *stack, unsigned int size);
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.
int UserSpaceManager_RegisterLoader(const char *imp, int prop);
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:
int UserSpaceManager_Run(const char *pathname, char *const argv[], char *const envp[], int prop, TaskManager_Task **task, TaskManager_Thread **thread);
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.
int UserSpaceManager_StrLen(const char *str, unsigned int *size);
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.
int UserSpaceManager_StrNCopy(char *dst, const char *str, unsigned int n, unsigned int *size);
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.
int UserSpaceManager_UnregisterLoader(const char *imp, int prop);
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.
Estas funções foram projetadas para os módulos do usuário.
void *UserSpaceManager_UBrk(void *addr);
Do usuário
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.
O ponteiro para o ponto final da heap.
int UserSpaceManager_URun(const char *pathname, char *const argv[], char *const envp[]);
Do usuário
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.