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>intmain(intargc, char**argv) {
void*a;
inti;
for (i=0; i<100; i++) {
a=malloc(100);
strcpy(a, "TESTE");
printf("%p %s\n", a, (char*)a);
free(a);
}
return0;
}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.oCompile o código C e o objeto assembly:
gcc -no-pie avalia.c alocador.o -o meuAlocador_testeExecute o programa e direcione a saída para um arquivo:
meuAlocador_teste > saida.txt