ID do artigo: 100775 - Última revisão: terça-feira, 3 de maio de 2005 - Revisão: 3.1

Descrição da pilha verificar aplicativos baseados 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 | Recolher tudo

Sumário

Pilha de check-in de aplicativo Windows NT difere pilha check-in de aplicativo do MS-DOS.

Mais Informações

Em um aplicativo do MS-DOS, estouro de pilha é detectado apenas pelo software. Por padrã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 de pilha que requer uma função com a quantidade de espaço de pilha disponível. Os problemas de função um erro de estouro se atual ponteiro da pilha e solicitada alocação da pilha excede o tamanho da pilha máximo especificado no cabeçalho EXE.

No sistema operacional Microsoft Windows NT, o estouro de pilha é detectado pelo hardware e software trabalhando juntos, usando os mecanismos de proteção de página. Cada novo processo do Windows NT tem um tamanho de pilha reservado máximo e uma alocação de pilha inicial confirmada. Memória confirmada é fisicamente alocada para o processo e é feita pelo arquivo de página; ele é um recurso relativamente "caro". Memória reservada é o espaço de endereço que não é mapeado para memória real; é um recurso relativamente "barato".

Conforme a pilha cresce, ele move na parte de pilha de memória confirmada para a memória reservada ou não confirmada. Quando isso acontece, ocorre uma falha de página e o sistema operacional confirma outra página de memória para a pilha. Se uma falha de página ocorre quando a pilha já cresceu para seu tamanho máximo especificado, o sistema relata uma exceção de estouro de pilha.

Esse método de crescimento automático usa uma página de proteção, uma página de memória reservada, não confirmadas, que é contígua com parte da memória confirmada. Quando o aplicativo toca a página de proteção, o sistema operacional confirma que a próxima página não confirmados e se torna a nova página de proteção. Pilha automática crescimento funciona somente para a memória de pilha e página de proteção deve crescer em incrementos de 4 K ou uma página. Se o aplicativo tocar outra página reservada, mas não confirmada de memória de pilha antes de ele toca a página de proteção, ocorre uma exceção de falhas de página normal e um comportamento imprevisível pode resultar.

Se uma função incluído as instruções a seguir no seu código de prólogo, esse problema pode ocorrer:
   PUSH   EBP
   MOV    EBP,ESP
   SUB    ESP,10000
   PUSH   ESI
				
in esse código, o envio EBP e envio ESI não ocorrem na mesma ou em adjacentes páginas de pilha de 4 K. Se a pilha deve crescer para acomodar a alocação de local de 10.000 bytes, falhas este programa.

Para impedir que a falha, o compilador chama a função __chkstk() cada vez que a alocação local excede 4 K. A função de __chkstk() do Windows NT não verifica explicitamente para o estouro de pilha como a versão do MS-DOS. Ele simplesmente toca endereços de memória cada 4 K do local do ponteiro de pilha atual para a alocação solicitada. Isso dispara as páginas de proteção na seqüência correta e confirma memória adicional para a pilha conforme necessário.

Portanto, quando a linha de comando do compilador inclui a opção de opção /Ge e o código de prólogo sempre chama a função __chkstk() , o aplicativo não sendo executado como eficiente como pode ocorrer porque o sistema operacional oferece suporte a um mecanismo automático para executar a detecção de estouro de pilha.

A opção de opção de compilador /Gs não desabilita todas as chamadas __chkstk() . Em vez disso, ele desativa __chkstk() chamadas para essas funções exigem menos de 4 K de armazenamento local. A opção /Gs é o comportamento padrão do compilador.

A opção /Gs aceita um parâmetro opcional, o valor de limite. Se local pilha alocação uma função exceder o limite especificado, o compilador insere uma chamada __chkstk() no prólogo de função. Para um aplicativo de modo de usuário para ser executado corretamente no Windows NT, é necessário o limite padrão 4096. Para suprimir todas as chamadas __chkstk() , especifique um valor de limite artificialmente alto, como / Gs999999 . O / Gs0 opção tem a mesma função como a opção /Ge e instrui o compilador para chamar __chkstk() em cada função. Talvez seja vantajoso para alterar o valor padrão se o código executa em um ambiente onde a pilha é totalmente confirmada ou se o mecanismo de crescimento de pilha não caso contrário, estará disponível.

Para obter mais informações, consulte a opção de compilação /Gs e o pragma pré-processamento check_stack no 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )