코가손의 블로그
메모리 영역, 스택 프레임 본문
메모리 영역
프로그램이 실행되기 위해서는 프로그렘이 메모리에 로드되어야 한다.
프로그램에서 사용되는 변수들을 저장할 공간도 필요하다.
프로그렘이 메모리에 로드 되면 프로세스가 되며
프로그램이 운영체제로부터 할당받는 대표적인 메모리공간은 아래의 그림과 같다.
코드 영역 : 실행할 코드가 저장되는 텍스트 영역, CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.
데이터 영역 : 프로그램의 전역 변수와 정적 변수가 저장되는 영역, 프로그램의 시작과 함께 할당되는 영역이며 프로그램이 종료되면 소멸한다.
힙 영역 : 사용자에 의해 메모리가 동적으로 할당되고 해제되는 영역
스택 영역 : 함수의 호출과 관계되는 지역 변수와 매개변수가 저장되는 영역, 스택 프레임의 형태로 스택영역에 저장됨
스택 영역
함수가 호출되면 스택프레임의 형태로 스택영역에 메모리가 할당된다.
int main()도 함수이며 func1()과 func2() 함수를 추가로 호출했을 때의 상황은 아래의 그림과 같다.
*스택 프레임 -> 매개변수 + 변환 주소값 + 지역 변수
스택 프레임은 높은주소에서 낮은주소로 쌓이며
함수끼리 서로의 정보를 전달하기 위해(func2리턴, 매개변수 전달 등) 레지스터를 이용한다.
스택 프레임이 어떻게 쌓이는지 예시를 들어보겠다.
void test(int a, int b, int c, int d)
{
char flag;
char buffer[10];
}
int main()
{
test(1, 2, 3, 4);
}
1. 스택 영역은 높은주소->낮은주소로 쌓이기 때문에 함수의 매개변수도 가장 오른쪽인 d 부터 쌓이게 된다.
2. 매개변수가 다 쌓이게 되면 리턴 주소를 저장한다. 리턴주소는 main()함수에서 test()함수가 호출된 다음 명령어를 가리킨다.
3. 현재의 EBP를 스택에 저장한다(SFP). test함수의 수행을 완료하면 main()함수로 돌아올 때 main()함수 내에서의 EBP값을 유지해야 하기 때문이다.
4. 현재 ESP 값을 EBP로 복사한다. 현재 함수에 대한 EBP값을 설정해 준다.
5. 로컬 변수를 저장한다.
+데이터 영역
'CS 및 기본기' 카테고리의 다른 글
Vector의 push_back vs emplace_back 차이점 (0) | 2023.01.16 |
---|---|
Vector vs List 차이와 캐시적중률 (0) | 2023.01.16 |
레지스터 (0) | 2021.11.09 |
컴퓨터 구조 (0) | 2021.11.09 |
엔디안(Endianness) (0) | 2021.11.09 |