Este projeto foca na implementação de um alocador de memória em linguagem Assembly, seguindo os princípios e desafios apresentados no livro Execução de Programas: Como funcionam carregadores, ligadores e interpretadores de Bruno Müller Junior. O objetivo é desenvolver um gerenciador de heap que otimize a alocação e desalocação de memória, além de fornecer uma visualização detalhada do seu estado.
Implemente o algoritmo proposto na Seção 6.1.2 do livro
Execução de Programas: Como funcionam carregadores, ligadores e interpretadores — Bruno Müller Junior, em linguagem Assembly.
Abaixo, o programa original em C correspondente ao Algoritmo 6.3, que imprime os endereços de alocações sucessivas:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {
void *a;
int i;
for (i = 0; i < 100; i++) {
a = malloc(100);
strcpy(a, "TESTE");
printf("%p %s\n", a, (char *)a);
free(a);
}
return 0;
}Implemente as seguintes variações no gerenciador de memória:
- a) Faça a fusão de nós livres.
- d) Utilize duas listas separadas:
- Uma lista com os nós livres.
- Uma lista com os nós ocupados.
O livro apresenta problemas graves como: "se os nós livres puderem ser divididos quando o tamanho for menor que o tamanho do bloco, podem ser criados vários nós de tamanho muito pequeno. Se forem muitos nós pequenos, podem ser criados muitos “buracos” na heap, o que é chamado fragmentação."
Sugestões do livro: "criar duas listas ligadas, uma contendo somente os nós livres e outra contendo somente os nós ocupados."
Implemente um procedimento que imprime um mapa da região da heap. As regras de exibição são:
- Cada byte da parte gerencial do nó deve ser impresso com o caractere:
# - Os bytes do bloco de dados devem ser impressos conforme o estado:
- Se estiver livre, use o caractere:
- - Se estiver ocupado, use o caractere:
+
- Se estiver livre, use o caractere:
Para compilar e testar o alocador, siga os passos abaixo no terminal:
-
Compile o arquivo assembly:
nasm -f elf64 alocador.asm -o alocador.o -
Compile o código C e o objeto assembly:
gcc -no-pie avalia.c alocador.o -o meuAlocador_teste -
Execute o programa e direcione a saída para um arquivo:
meuAlocador_teste > saida.txt