Artigo: 100775 - Última revisão: terça-feira, 3 de Maio de 2005 - Revisão: 3.1

Descrição da pilha a procurar aplicações baseadas no Windows NT

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Reduzir tudo

Sumário

Pilha verificar na aplicação do Windows NT é diferente da pilha dar entrada a aplicação de MS-DOS.

Mais Informação

Numa aplicação de MS-DOS, capacidade excedida da pilha é detectada apenas por software. Por predefinição, o compilador insere uma chamada para a função __chkstk() no código de prólogo para cada função. A função __chkstk() compara a quantidade de espaço pilha que requer uma função com a quantidade de espaço disponível na pilha. Os problemas de função um erro de excesso se actual ponteiro de pilha e alocação de pilha de pedido excede o tamanho da pilha máximo especificado no cabeçalho do EXE.

No sistema operativo Microsoft Windows NT, capacidade excedida da pilha é detectada pelo hardware e software trabalham em conjunto, utilizando os mecanismos de protecção de página. Cada processo novo do Windows NT tem um tamanho máximo reservado pilha e uma alocação de pilha inicial consolidada. Memória consolidada é fisicamente atribuída ao processo e é suportada por ficheiro de paginação; é um recurso relativamente "Caro". Memória reservada é espaço de endereços que não esteja mapeado para memória real; é um recurso relativamente "ordinário".

Como a pilha aumenta, move da parte da memória de pilha consolidada na memória não consolidada ou reservada. Quando isto acontece, ocorre um erro de página e o sistema operativo efectua outra página de memória para a pilha. Se uma falha de página ocorre quando a pilha já cresceu para o tamanho máximo especificado, o sistema apresenta uma excepção de excesso de pilha.

Este método de crescimento automática utiliza uma página de protecção, uma página de memória reservada, não consolidados, que é contígua com parte da memória consolidada. Quando a aplicação toca a página de protecção, o sistema operativo confirma que página e a página seguinte não consolidada torna-se a nova página de protecção. Crescimento de pilha automática funciona apenas para a memória de pilha e de página de protecção tem aumentar em incrementos de 4 K ou uma página. Se a aplicação tocar outra página reservada mas não consolidada de memória de pilha antes de tocar a página de protecção, ocorre uma excepção de falhas de página normal e pode provocar um comportamento imprevisível.

Se uma função incluir as seguintes instruções no respectivo código de prólogo, este problema poderá ocorrer:
   PUSH   EBP
   MOV    EBP,ESP
   SUB    ESP,10000
   PUSH   ESI
				
in este código, a EMISSÃO EBP e EMISSÃO ESI não ocorrem na mesma ou em páginas de pilha de 4 K adjacentes. Se a pilha deve aumentar para acomodar a atribuição local de 10.000 bytes, falhas neste programa.

Para evitar a falha, o compilador chama a função __chkstk() sempre que a atribuição local excede 4 K. A função de __chkstk() Windows NT não verifica explicitamente a existência de capacidade excedida da pilha tal como a versão do MS-DOS. Basta tocar endereços de memória cada 4 K da localização de ponteiro de pilha actual para a atribuição pedida. Isto activa as páginas de protecção na sequência adequada e consolida memória adicional para a pilha conforme necessário.

Por conseguinte, quando a linha de comandos do compilador inclui o parâmetro de opção /Ge e o código de prólogo sempre chama a função __chkstk() , a aplicação está a ser não executado como eficientemente como pode acontecer porque o sistema operativo suporta um mecanismo automático para efectuar a detecção de excesso de pilha.

O parâmetro de opção do compilador /GS não desactiva todas as chamadas __chkstk() . Em vez disso, desactiva __chkstk() chamadas para as funções que requerem menos de 4 K de armazenamento local. A opção /GS é o comportamento predefinido do compilador.

A opção /GS aceita um parâmetro opcional, o valor de limiar. Se alocação de pilha local uma função exceder o limiar especificado, o compilador insere uma chamada __chkstk() prólogo função. Para uma aplicação de modo de utilizador para ser executada correctamente num Windows NT, é necessário o limite predefinido 4096. Para suprimir todas as chamadas __chkstk() , especifique um valor de limite superior artificialmente como / Gs999999 . O / Gs0 opção tem a mesma função que a opção /Ge e indica o compilador para chamar __chkstk() em cada função. Poderá ser vantajoso para alterar o valor predefinido se o código é executado num ambiente em que a pilha está completamente consolidada ou se o mecanismo de crescimento de pilha caso contrário, não está disponível.

Para mais informações, consulte a opção de compilação /GS e o pragma pré-processador check_stack in o Visual C++ Books Online.

A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kbhowto kbcompiler kbinfo KB100775 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 100775  (http://support.microsoft.com/kb/100775/en-us/ )