Layout de memória.
Já se perguntou como funciona a infraestrutura da memória RAM?
Um programa em execução em um computador irá reservar uma área na memória RAM para que seus dados sejam interpretados durante seu funcionamento.
Uma memória RAM é um componente no computador responsável por cuidar dos endereços virtuais, sua infraestrutura consiste em frames, páginas e segmentos.
As seções separadas vistas na imagem são chamadas de segmentos, divisões lógicas que montam a estrutura do programa.
Páginas virtuais é a divisão dos segmentos, o tamanho mínimo dessa página (bloco) no GNU/Linux na arquitetura x86-64 é 4KB. um segmento de 12 KB será divido em 3 páginas virtuais:
Página virtual 0: endereços 0x400000 a 0x400fff
Página virtual 1: endereços 0x401000 a 0x401fff
Página virtual 2: endereços 0x402000 a 0x402fff
Sendo assim, o segmento está na página cujo endereço inicial é 0x400000
Frames são os espaços reais onde o programa roda. Diferente do endereço virtual que roda dentro de um espaço ilusório, o físico irá rodar em uma área - não contínua - e geralmente, menor ao tamanho do programa, entretanto, nem todas páginas estão carregadas na RAM ao mesmo tempo. Esse mecanismo é feito para não haver rompimento, intrusão de aplicativos em cima de outros.
Endereços altos = começando com '0x7ffc' e '0x7f84', ficam próximos do topo (stack)
Endereços baixos = começando com '0x561a', ficam na base (binários e início da heap)
Da base para o topo
Conteúdo binários são mapeados nas faixas de endereços mais baixas, conteúdos exclusivos do programa.
.text = código do programa executável, somente leitura para evitar modificações durante sua execução.
.rodata = dados constantes, strings literais.
.data = dados globais e estáticos inicializados, já com valor definido.
.bss = dados globais e estáticos não inicializados, o sistema operacional zera toda essa parte, não ocupam espaço no arquivo mas, ao ir para a memória é reservado o espaço deles.
HEAP
Programming Break = define o início de uma outra região da memória que o programa pode utilizar para alocar dado dinamicamente, pode ser uma array, buffer, leituras. São partes onde o programa ainda não sabe o valor exato então mantém códigos para alocação. Muitas vezes necessitam de memória extra, e, caso não usem mais, devem liberar memória explicitamente (em C, com free) ou contar com um garbage colletor.
Também são mapeados os arquivos das bibliotecas do que o programa vêm a utilizar.
MMAP
Grandes alocações de memória, memória compartilhada, mapeamente de arquivos e bibliotecas compartilhada são localizadas nessa região. Pois não pertencem à stack e nem ao heap.
Da base (endereços mais baixos) até a HEAP e MMAP, os dados crescem para cima, indo de encontro com os endereços mais altos.
A partir dos endereços mais altos, temos a região de extrema importância.
STACK
Stack é uma estrutura da memória onde os dados são inseridos, acessados e removidos durante a execução de um programa. Opera no princípio FILO (First In, Last Out), se eu quiser acessar o dado colocado na posição 2, preciso primeiro remover o dado na posição 1, que está acima dele.
PUSH
Inserção de dado na pilha de execução do programa;
O registrador RSP (register stack pointer) passa a apontar para o endereço desse último dado inserido;
POP
Remoção / extração de um dado na stack;
O dado é copiado para um destino e removido da pilha
O registrador é reposicionado para o dado anterior, ou seja, o dado que estava sendo apontado pelo RSP agora aponta o de baixo daquele que você tirou.
Esclarecimentos:
Esse é uma nota básica autodidata que eu fiz, sem intenções de ganhar crédito.
1º versão.
Agradecimentos:
Canal do YouTube @depxp (Blau Araujo) pelas imagens que demonstram o layout.
Links legais:
https://www.digitalocean.com/community/tutorials/java-heap-space-vs-stack-memory
https://www.sciencedirect.com/topics/engineering/stack-memory
Vídeos gravados por mim
Comments
Post a Comment