2014-10-13 3 views
0

이 질문은 C 표준보다는 컴파일/연결과 관련이 있다고 가정합니다. 다른 가능한 공동이 존재하는 어떤 스택 코드 섹션, 데이터 섹션 후 위치해있는 명백한 경우를 제외스택 크기 계산 방법

#define ORDER(a,b,c) ((a) <= (b) && (b) <= (c)) 

int global; 

int main() 
{ 
    int local; 

    unsigned long long dataAddr = (unsigned long long)&global; 
    unsigned long long stackAddr = (unsigned long long)&local; 
    unsigned long long codeAddr = (unsigned long long)main; 

    if (ORDER(stackAddr,dataAddr,codeAddr) || ORDER(codeAddr,stackAddr,dataAddr)) 
     printf("Stack size is %llu bytes\n",dataAddr-stackAddr); 

    else if (ORDER(stackAddr,codeAddr,dataAddr) || ORDER(dataAddr,stackAddr,codeAddr)) 
     printf("Stack size is %llu bytes\n",codeAddr-stackAddr); 

    else 
     printf("Stack size cannot be computed with this method\n"); 

    return 0; 
} 

:

스택 크기를 계산하기위한 다음의 방법을 고려 이 방법으로?

하나 이상의 섹션이 예상대로 시작되지 않을 수 있습니까?

감사합니다.

+0

"C"와 관련해서는 "스택"이 있다는 보장은 없으므로 문제가 될 수 있습니다. 적어도 이론적으로는. – unwind

+0

@unwind : 고맙습니다.나는이 질문이 C 표준 (질문의 시작 부분에서 언급했듯이)보다는 컴파일/링 케이지와 더 관련이 있다고 가정한다. 컴파일러/링커가 실행 가능한 이미지를 생성하는 방식과 관련하여 이는 실용적인 질문입니다. –

답변

2

최신 컴퓨터에서는 더 이상 최대 스택 크기를 결정할 좋은 방법이 없습니다. 예를 들어, 많은 OS는 가상 메모리 시스템을 사용하여 스택이 무작위 (그러나 높은) 주소에서 시작되도록합니다. 보안상의 이유로 무작위입니다. 64 비트 시스템을 사용하는 경우 실제 RAM보다 수백만 또는 수십억 주소가 더 많으므로 스택의 시작으로 거의 알려지지 않습니다. 스택이 더 큰 주소 (HP-UX)로 성장하는 시스템을 보았습니다.

같은 코드 세그먼트는 어느 곳에서나 사용할 수 있습니다 (그리고 오늘날은 종종 보안입니다).

마지막으로 두 개 이상의 글로벌 데이터 세그먼트가 있습니다. 많은 C 구현에서 최소한 하나의 초기화 된 전역 세그먼트와 하나의 초기화되지 않은 전역 세그먼트가 있습니다. 하지만 여러 가지 이유로 더 많은 세그먼트를 만드는 컴파일러를 보았습니다.

이 질문은 더 불쾌한 자세한하지만 어떤 솔루션을 포함 Checking available stack size in C

1

난이도 현명한 방법이 될하기 시작 표시되지 않습니다. 무엇보다도, 각각 성장, 그것은

  • 스택을 가정하고 전역/코드는 바로 옆에
  • 사이의 스택에 아무것도 서로에 있습니다에 할당 지역의 "올바른"끝에서 시작 올바른 방향으로
  • codeAddr을 사용하는 경우 "코드"세그먼트의 시작/끝 부분에 &main 점이 있다고 가정합니다. main 만 정의하더라도 다른 많은 코드가 기본적으로 링크됩니다.
  • dataAddr을 사용하는 경우 "데이터"세그먼트의 시작/끝 부분에 &global 점이 있다고 가정합니다. 이 변수 만 정의하더라도 표준 라이브러리는 일부 변수도 정의합니다.

이러한 사항을 가정 할 충분한 이유가 없습니다. 게다가, 그것은 완전히 불필요합니다. 스택 크기를 알아내는 신뢰할 수있는 메커니즘이 있습니다. OS마다 다르지만 적어도 해당 아키텍처를 실행하는 다른 아키텍처 간에는 이식성이 뛰어납니다. 모든 가정이 충족 될 경우 메서드에서 발생할 수있는 사소한 부정확성으로 인해 어려움을 겪지는 않습니다. (예를 들어 스택 메모리의 "끝"에는 보통 두 개의 사용 불가능한 페이지가 있습니다).

스택 크기를 신경 써야 할 충분한 이유가 거의 없다는 것은 말할 필요도 없습니다.