Call Stack Frame
Call Stack Frame개념에서 우리가 함수가 return 된 후에 지역변수를 사용할 수 없는 이유를 어느 정도 알 수 있다.
메모리의 스택을 좀더 자세히 알아보자.
Call Stack
Stack의 구성
(1) 파라메터: 호출되는 함수의 인자에 assign 되는 값
(2) 지역변수: 호출되는 함수 내에서만 생성되는 변수
(3) return address: 호출되는 함수 종료 시 되돌아가 수행을 계 속해 가기 위하여 jump 해 가야 할 주소
(4) frame point(stack frame pointer): 스택 상의 프레임 시작 주소. 보통 EBP 레지스터에 저장된다.
(5) Stack Pointer: 콜 스택의 최상위 메모리 주소. 보통 ESP 레지스터에 저장된다.
* frame이란?
함수호출 시 스택 상에서 운용되는 내용(데이터)
프레임 포인터: 스택 상의 프레임 시작 주소(베이스 주소)
프레임의 크기가 함수마다 다르기 때문에 바로 이전 프레임의 프레임 포인터 값을 프레임 내에 간직하고 있어야 함.
간단히 생각하면, stack에는 여러 함수가 들어오기 때문에 각 함수를 구분해주는 포인터라고 생각하면 된다.
[ main 함수에서 func(x, y) 함수를 호출했을 경우 EBP, ESP 레지스터 값의 변화 과정 ]
1. main 함수 실행
EBP 레지스터는 main 함수의 최하단 주소 값,
ESP 레지스터는 main 함수의 최상단 주소 값을 저장한다.
2. func(x, y) 함수 실행
먼저 func 함수의 프레임에 바로 이전 프레임의 프레임 포인터 값(main 함수의 프레임 포인터 값) 즉, EBP 레지스터의 값을 저장한다. → EBP레지스터를 ESP 값으로 변경하기 때문에 이전 함수의 시작 주소를 알 수 없게 된다. 이때를 위해 frame pointer 즉, 이전 EBP 레지스터의 값을 저장해놓는다.
그 후 EBP 레지스터를 ESP 레지스터의 값으로 변경하고,
ESP 레지스터를 func 함수의 최상단 주소 값으로 변경한다.
이렇게 함수가 끝나면 메모리에 남아있는 지역 변수를 모두 pop해 버리기 때문에 값을 사용할 수 없게 된다.
pop함과 동시에 EBP레지스터는 저장해놓았던 이전 EBP레지스터의 값으로 바꾸기 때문에 프레임을 유지할 수 있다.
*더 자세한 내용 참고
'CS > 운영체제' 카테고리의 다른 글
[Chapter 3. 프로세스] 프로세스의 생성과 종료 (0) | 2022.08.18 |
---|---|
[Chapter 3. 프로세스] 프로세스 상태와 Context Switching, PCB(Process Control Block) (0) | 2022.08.17 |
[Chapter 3. 프로세스] 프로세스와 문맥 (0) | 2022.08.16 |
[Chapter 2. 시스템 구조] 입출력 시스템을 위한 운영체제의 3가지 인터페이스 (시스템 콜, 커널-드라이버 인터페이스, HW 인터페이스), 시스템 콜이 처리되는 과정 (0) | 2022.08.15 |
[Chapter 2. 시스템 구조] 이중 연산 모드와 모드 비트 (0) | 2022.08.14 |