Arquivo de módulo do sistema

Esta página descreve o formato do arquivo de módulo do sistema versão 0.3

O arquivo de módulo do sistema tem informações sobre interfaces, implementações e funções, além de dados para arrumar as referências aos dados e código do módulo.

O arquivo é dividido nas seguintes seções: cabeçalho, strings utilizadas, funções utilizadas, relocação das funções utilizadas, relocação nos dados, relocação no código e interfaces implementadas.

Cabeçalho

O cabeçalho do arquivo fica no início e tem informações sobre o tamanho e a posição de cada uma das seções, além de informações globais do módulo. O seu formato é:

TamanhoDescrição
16 bytesMD5 fingerprint ou message-digest do restante do arquivo
4 bytesSM03 - Assinatura de identificação (System Module 0.3)
4 bytesInício do código do módulo
4 bytesTamanho do código do módulo
4 bytesInício dos dados do módulo
4 bytesTamanho dos dados do módulo
4 bytesTamanho dos dados não iniciados
4 bytesInício da seção das funções utilizadas
4 bytesTamanho da seção das funções utilizadas
4 bytesInício da seção de relocação das funções utilizadas
4 bytesTamanho da seção de relocação das funções utilizadas
4 bytesInício da seção das interfaces implementadas
4 bytesTamanho da seção das interfaces implementadas
4 bytesInício da seção de relocação nos dados
4 bytesTamanho da seção de relocação nos dados
4 bytesInício da seção de relocação no código
4 bytesTamanho da seção de relocação no código
4 bytesInício da seção com as strings do arquivo
2 bytesTamanho da seção com as strings do arquivo
2 bytesVersão do módulo
2 bytesPropriedades do módulo
2 bytesÍndice para o comentário
4 bytesInício da função Phase0Start
4 bytesInício da função Phase1Start
4 bytesInício da função Shutdown

Se o tamanho de uma seção for 0 ela não existe. Assim, se a seção com os dados tiver tamanho 0, quer dizer que não existem dados no módulo.

O campo MD5 fingerprint é usado para validar o restante do arquivo. Isso garante que o arquivo não está corrompido.

Dados não iniciados têm o seu conteúdo iniciado com zero.

A área de dados do módulo é composta da seguinte maneira: dados iniciados + dados não iniciados.

O campo versão tem o seguinte significado: os 8 bits mais significativos (versão >> 8) são a versão mais significativa, os 4 bits seguintes (versão & 0xf0) são outra versão e os 4 bits menos significativos (versão & 0xf) são a última versão. Por exemplo: 0.1.0 ou 20.15.5

As propriedades do módulo não são usadas.

Se não existir função start ou shutdown, o início será 0xffffffff.

Strings do arquivo

Esta seção contém todas as strings utilizadas nas seções do arquivo de módulo. As strings terminam com o byte 0. É o mesmo tipo de string usado na linguagem C/C++.

A primeira string é a string vazia, ou seja, o primeiro byte desta seção é o byte zero.

As strings não podem se repetir nesta seção. Elas devem ser únicas.

Funções utilizadas

Esta seção contém informações sobre as funções utilizadas pelo módulo.

Cada entrada tem o seguinte formato:

TamanhoDescrição
2 bytesÍndice para o nome da interface
2 bytesÍndice para o nome da implementação
2 bytesnúmero da função

O nome da interface e da implementação podem ter no máximo 32 caracteres cada incluindo o zero final.

Relocação das funções utilizadas

Esta seção contém informações sobre a localização e o tipo de relocação que deve ser feita para a chamada de funções das interfaces.

Esta seção deve estar ordenada pelo deslocamento de forma crescente.

Cada entrada desta seção tem o seguinte formato:

TamanhoDescrição
4 bytesDeslocamento dentro do código onde a função é chamada
1 bytePropriedades da relocação
3 bytesÍndice para a função utilizada

As propriedades podem ser:

TamanhoPosiçãoDescrição
1 bitbit 01 - relocação absoluta; 0 - relocação relativa

Na relocação absoluta, o endereço na memória do início da função utilizada é colocado no deslocamento a ser mudado.

Já na relocação relativa, o endereço na memória do início da função utilizada é subtraído do endereço de memória onde a relocação está sendo feita. Ou seja, é uma chamada relativa ao endereço da instrução que chamou.

Interfaces Implementadas

Esta seção contém todas as interfaces implementadas por este módulo.

O formato é o seguinte: primeiro vem as informações da interface e logo em seguida as implementações, depois mais outra interface com suas implementações e assim por diante.

Ou seja, tem o seguinte formato:

TamanhoDescrição
2 bytesÍndice para o nome da interface
2 bytesNúmero de funções na interface
2 bytesNúmero de implementações desta interface
4 bytesInício (relativo ao início do arquivo) das funções desta implementação
2 bytesÍndice para o nome da implementação
......(mais implementações desta interface)
......(mais interfaces)

O nome da interface e da implementação podem ter no máximo 32 caracteres cada incluindo o zero final.

A seção com as funções de uma implementação tem o seguinte formato:

TamanhoDescrição
4 bytesInício (relativo ao início do código do módulo) do código
1 bytePropriedades
1 byteNúmero de palavras (4 bytes) na pilha
......(mais funções)

O campo número de palavras com tamanho 4 bytes é usado somente para as funções do usuário e diz quantas palavras devem ser copiadas da pilha do usuário para a pilha do sistema quando a função é chamada por um módulo do usuário.

O campo propriedades tem o seguinte formato:

TamanhoPosiçãoDescrição
1 bitbit 01 - do sistema; 0 - do usuário
1 bitbit 11 - função não implementada

Relocação nos dados

Esta seção tem o seguinte formato:

TamanhoDescrição
4 bytesTamanho do bloco de relocação dos dados
4 bytesTamanho do bloco de relocação do código
até 4GB bytesBloco de relocação dos dados
até 4GB bytesBloco de relocação do código

O bloco de relocação dos dados tem informações sobre a relocação das referência para os próprios dados (uma variável quer o endereço de outra variável no bloco de dados).

O bloco de relocação do código tem informações sobre a relocação das referência para o código (uma variável quer o endereço de uma parte de código).

Cada entrada nesses blocos é um deslocamento dentro do bloco de dados para a referência que tem que ser mudada. Cada referência é assim computada: localização do início do bloco na memória + a palavra de 32 bits no deslocamento a ser mudado.

Relocação no código

Esta seção tem o seguinte formato:

TamanhoDescrição
4 bytesTamanho do bloco de relocação dos dados
4 bytesTamanho do bloco de relocação do código
até 4GB bytesBloco de relocação dos dados
até 4GB bytesBloco de relocação do código

O bloco de relocação dos dados tem informações sobre a relocação das referência para os dados (o código quer o endereço de uma variável no bloco de dados).

O bloco de relocação do código tem informações sobre a relocação das referência para o próprio código (o código quer o endereço de uma parte de código).

Cada entrada nesses blocos é um deslocamento dentro do bloco de código para a referência que tem que ser mudada. Cada referência é assim computada: localização do início do bloco na memória + a palavra de 32 bits no deslocamento a ser mudado.