반응형

C언어의 메모리 구조

 

C언어의 메모리 구조

C 언어에서 대략 메모리 구조는 위와 같이 생겼다. 코드 영역(Code) 코드 영역은 실행할 프로그램의 코드가 저장되는 영역. 텍스트 영역(Text)라고도 불림. CPU는 코드 영역에 저장된 명령어를 하나

soopeach.tistory.com


메모리의 스택 영역은 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역.
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸함.

 

함수가 호출되면 스택에는 함수의 매개변수, 호출이 끝난 뒤 돌아갈 반호나 주소값, 함수에서 선언된 지역변수 등이 저장됨.

이렇게 스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라고 함.

이런 스택 프레임 덕분에 함수의 호출이 모두 끝난 후, 해당 함수가 호출되기 이전 상태로 돌아갈 수 있음.


스택 프레임의 동작 방식

int main(void)

{

    func1();  // func1() 호출

    return 0;

}

 

void func1()

{

    func2();  // func2() 호출

}

 

void func2()

{

}

이러한 동작을 하는 코드가 있다고 해보자.

1. 프로그램이 실행되면 main() 함수가 호출되고 main() 함수의 스택 프레임이 스택에 저장.

2. func1() 함수를 호출하면 해당 함수의 매개변수, 반환 주소값, 지역 변수 등의 스택 프레임이 스택에 저장.

3. func2() 함수를 호출하면 해당 함수의 스택 프레임에 스택에 저장.

4. func2() 함수의 모든 작업이 완료되어 반환되면, func2() 함수읭 스택 프레임만이 스택에서 제거.

5. func1() 함수의 호출이 종료되면, func1() 함수의 스택 프레임이 스택에서 제거.

6. main() 함수의 모든 작업이 완료되면, main() 함수의 스택 프레임이 스택에서 제거되면서 프로그램이 종료.


스택 오버플로우(Stack Overflow)

앞서 함수의 재귀 호출이 무한히 반복되면, 해당 프로그램은 스택 오버플로우(Stack overflow)에 의하여 종료됨.

 

만약 재귀 호출이 무한히 반복되면, 위 그림에서 Step 3 이후로는 재귀 호출에 의한 스택 프레임이 계속해서 쌓이게 됨.

이렇게 계속 쌓이게 되면 스택의 모든 공간을 다 차지하고 난 후 더 이상의 여유 공간이 없을 때 또 다시 스택 프레임을 저장하게 되면, 해당 데이터는 스택 영역을 넘어가서 저장된다.

이렇게 해당 스택 영역을 넘어가도 데이터가 저장될 수 있으면, 해당 프로그램은 오동작을 하게 되거나 보안상 큰 취약점을 갖게됨.

C언어에서는 실행 중인 프로그램에서 스택 오버플로우가 발생하면, 에러를 발생시키고 강제 종료를 시키게 됨.


출처

http://www.tcpschool.com/c/c_memory_stackframe

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기