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.
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 é:
Tamanho | Descrição |
---|---|
16 bytes | MD5 fingerprint ou message-digest do restante do arquivo |
4 bytes | SM03 - Assinatura de identificação (System Module 0.3) |
4 bytes | Início do código do módulo |
4 bytes | Tamanho do código do módulo |
4 bytes | Início dos dados do módulo |
4 bytes | Tamanho dos dados do módulo |
4 bytes | Tamanho dos dados não iniciados |
4 bytes | Início da seção das funções utilizadas |
4 bytes | Tamanho da seção das funções utilizadas |
4 bytes | Início da seção de relocação das funções utilizadas |
4 bytes | Tamanho da seção de relocação das funções utilizadas |
4 bytes | Início da seção das interfaces implementadas |
4 bytes | Tamanho da seção das interfaces implementadas |
4 bytes | Início da seção de relocação nos dados |
4 bytes | Tamanho da seção de relocação nos dados |
4 bytes | Início da seção de relocação no código |
4 bytes | Tamanho da seção de relocação no código |
4 bytes | Início da seção com as strings do arquivo |
2 bytes | Tamanho da seção com as strings do arquivo |
2 bytes | Versão do módulo |
2 bytes | Propriedades do módulo |
2 bytes | Índice para o comentário |
4 bytes | Início da função Phase0Start |
4 bytes | Início da função Phase1Start |
4 bytes | Iní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.
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.
Esta seção contém informações sobre as funções utilizadas pelo módulo.
Cada entrada tem o seguinte formato:
Tamanho | Descrição |
---|---|
2 bytes | Índice para o nome da interface |
2 bytes | Índice para o nome da implementação |
2 bytes | número da função |
O nome da interface e da implementação podem ter no máximo 32 caracteres cada incluindo o zero final.
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:
Tamanho | Descrição |
---|---|
4 bytes | Deslocamento dentro do código onde a função é chamada |
1 byte | Propriedades da relocação |
3 bytes | Índice para a função utilizada |
As propriedades podem ser:
Tamanho | Posição | Descrição |
---|---|---|
1 bit | bit 0 | 1 - 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.
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:
Tamanho | Descrição |
---|---|
2 bytes | Índice para o nome da interface |
2 bytes | Número de funções na interface |
2 bytes | Número de implementações desta interface |
4 bytes | Iní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:
Tamanho | Descrição |
---|---|
4 bytes | Início (relativo ao início do código do módulo) do código |
1 byte | Propriedades |
1 byte | Nú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:
Tamanho | Posição | Descrição |
---|---|---|
1 bit | bit 0 | 1 - do sistema; 0 - do usuário |
1 bit | bit 1 | 1 - função não implementada |
Esta seção tem o seguinte formato:
Tamanho | Descrição |
---|---|
4 bytes | Tamanho do bloco de relocação dos dados |
4 bytes | Tamanho do bloco de relocação do código |
até 4GB bytes | Bloco de relocação dos dados |
até 4GB bytes | Bloco 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.
Esta seção tem o seguinte formato:
Tamanho | Descrição |
---|---|
4 bytes | Tamanho do bloco de relocação dos dados |
4 bytes | Tamanho do bloco de relocação do código |
até 4GB bytes | Bloco de relocação dos dados |
até 4GB bytes | Bloco 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.