2017-03-08 15 views
0

UEFI EDK2 Bios 소스에서 작업 중입니다. 우리는 EDK2 소스에 플랫폼 관련 새 패키지를 만들었습니다. 플랫폼 관련 코드에 우리가 추가 한 이상한 문제가 있습니다.C 파일의 로컬 변수가 GCC 컴파일 코드 인 스택에 생성되지 않습니다.

내가 소스 레벨 디버깅을했을 때, C 함수의 로컬 변수가 GCC로 컴파일 될 때 스택에 생성되지 않는다는 것을 알았습니다.

Visual Studio로 컴파일 할 때 동일한 UEFI 코드를 사용하면 C 함수의 지역 변수가 스택에 생성됩니다.

내가 스택 자료, 모든 세그먼트 레지스터, 현재 실행 코드, 메모리 등을 볼 수있는 시뮬레이션 환경에서이 코드를 실행하고 ..

자사의 멀티 코어 시스템 만 사용할 수 만 부트 스트랩 프로세서

+4

아마도 GCC는 변수를 레지스터에 넣거나 사용하지 않았기 때문에이를 최적화했습니다. 왜 이것이 문제인지 설명하지 못하고 (물론 코드를 보여 주지도 않습니다). – unwind

+1

최적화 문제 일 수 있습니까? 그리고 지역 변수 (a.k.a. * 자동 변수 *)는 * 스택에 *있을 필요가 없습니다. –

답변

0

C11 언어 사양을 읽으면 스택이나 스택 프레임을 언급하지 않았거나 스택에 변수를 넣지 않은 것을 알 수 있습니다. 어떤 종류의 스택에도 자동 변수를 넣을 C가 필요하지 않습니다.

프로그램이 자동 변수 (예 : static 키워드없이 함수 범위 내에 정의 된 변수)를 저장하는 방법은 전적으로 컴파일러에 달려 있습니다. 예전에는 대부분의 컴파일러가 인수, 반환 주소 및 로컬 변수를 위해 시스템 스택에 공간을 만들었습니다. 현대에서는 프로세서가 일반적으로 많은 레지스터를 갖고 있기 때문에 이것이 바람직하지 않습니다. 가능하다면 레지스터에 지역 변수와 함수 인수를 유지하는 것이 더 효율적입니다. 컴파일러는 스택에 자동 변수를 저장하는 데 필요한 이유 두 가지 이유가 있습니다

: 레지스터

  • 기능은 필요에 그들 모두를 넣어 너무 많은 변수와 인수가 있습니다

    1. 변수의 주소 (레지스터에 대한 포인터를 가질 수 없음)

    그래서 gcc는 스택을 만들 필요가 없다고 판단합니다. 귀하의 변수에 대한 공간 및 레지스터에 간다. Visual Studio C 컴파일러는 항상 마이크로 소프트에 의해 무시당하는 것으로 악명 높았으므로 자동 변수에 대한 현대적인 아이디어에서는 그렇지 않을 수 있습니다.

    또한 컴파일러가 변수를 최적화하는 경우가 많습니다. 변수를 유용하게 사용하지 않으면 컴파일러는 변수가 필요 없다고 결정할 수 있습니다. 컴파일러가 그것을 멀리 던질 수하고 너무 그 버리지 않도록 다음 변수를 필요로하지 않습니다 알 수 있도록 다음 코드

    int f() 
    { 
        int i; 
    
        for (i = 0 ; i < 10 ; ++i); 
        return 0; 
    } 
    

    예를 들어 루프는 비어 있습니다.