Conteúdo da área de pilha de um processo

3

Eu tenho lido alguns livros de texto Unix e não consigo ter uma imagem clara do conteúdo da área de pilha do processo. Alguém pode explicar ou apontar algumas referências?

    
por sriram selvam 16.07.2013 / 18:42

3 respostas

4

Você só terá uma imagem clara da pilha assim que o kernel passar para ld.so , o vinculador dinâmico. Você pode encontrar uma foto básica aqui . Isso mostra argc , argv e envp , os 3 argumentos tradicionais para int main(int argc, char **argv, char **envp) de um programa em C.

Essa visão é um pouco simplista. Um vetor auxiliar ELF também existe na pilha e transmite muitas informações para ld.so

Depois que ld.so é executado, o tempo de execução da libc entra e complica as coisas. Construtores de C ++ podem ser executados, todos os tipos de coisas malucas podem acabar na pilha. Depende do que compilou o programa. Até mesmo programas C simples podem fazer coisas diferentes com base na biblioteca que eles foi compilado com .

    
por 16.07.2013 / 19:49
1

Este artigo da wikipedia é bastante conciso. Se você procurar no Google "pilha versus pilha", você encontrará uma tonelada de coisas; geralmente eles são explicados em relação um ao outro.

Se você não fizer nenhuma programação, isso não é uma coisa particularmente útil ou importante para você entender. Se você fizer isso, então é; um lugar onde a maioria das pessoas encontra pela primeira vez o significado da pilha são as chamadas WRT recursivas ; um artigo da Wikipédia mais detalhado e relevante para isso diz respeito à pilha de chamadas . A pilha de chamadas é o que ocupa a "área de pilha de um processo"; ele contém dados locais para chamadas de função e dados para chamadas de funções aninhadas ou recursivas são "empilhadas" umas em cima das outras em Encomenda LIFO .

Se você não fez nenhuma programação em uma linguagem que permita endereçamento direto de memória (por exemplo, C / C ++), entender como os endereços de memória mapeiam regiões de memória é importante, espero que seus livros já tenham passado por isso.

    
por 16.07.2013 / 19:43
1

Os programas geralmente empurram argumentos de função para a pilha, antes de usar a instrução asm CALL para chamar a função, que envia o endereço de retorno para a pilha, para que a instrução RET possa depois recuar e saber para onde retornar. Uma função também normalmente colocará suas variáveis locais na pilha. A função de chamada também pode empurrar qualquer registrador que estiver usando na pilha antes de fazer uma chamada, para que ela possa estourá-los de volta depois que a função chamada tiver usado aqueles registros para outra coisa.

Uma representação visual das palavras na pilha em que functionA chamou functionB pode ter esta aparência:

local1
arg1
functionA+12
local1
local2

Aqui, functionA tinha uma variável local e, em seguida, passava um argumento para functionB e armazenava o endereço de retorno (12 bytes após o início da funçãoA). Então functionB coloca duas de suas próprias variáveis locais na pilha. Se functionB chamar functionC, a pilha continuará a crescer e, em seguida, voltará a encolher conforme as funções retornarem.

    
por 16.07.2013 / 20:00