Local Variables & Global Variables
공간(Scope) | 시간(Extant) | Memory Allocation | |
Local variable | 선언된 함수 내부에서만 access 가능 | Dynamic extant ( 함수 수행되는 동안) | Dynamic Allocation - 함수 return할 때 memory 공간 반환 |
Global variable | 어느 곳에서나 access 가능 | Static extant(처음 ~ 끝) | Operating System이 아예 동작이 끝나고 memory 공간 반환 |
- Excutable file
- 운영체제와 CPU가 이해할 수 있는 형태
- 사용자가 해당 파일 실행 -> 프로그램 실행, 원하는 결과 출력
- C언어에서의 symbol(function, variable name)이 Excutable file 에서는 읽히지 않기에 memory address가 필요함
- C언어에 있는 function의 function name이 function memory address를 가리킴
- C언어에 있는 variable의 variable name이 variable memory address를 가리킴
하지만 global variable의 메모리 주소는 잘 알 수 있으나 local variable에서는 임의의 주소로 할당되기 때문에 local variable address를 알지 못합니다.
이러한 문제를 해결하기 위해 Stack 이라는 개념이 필요합니다.
Stack
LIFO (Last in First out)에 따라 데이터의 삽입(push)과 삭제(pop)가 이루어지는 자료구조
ex. push(a) -> push(b) -> push(c) -> pop()
위의 명령어를 통해 c가 나옴
Variable allocation using Stack
Compiler가 local variable의 dynamic allocation을 위해 어떤 일을 하는지 보려면 C compiler가 생성한 instruction 보면 됨
main()
{
int a=2, b=13;
int res;
res=add(a,b);
}
int add(int x, int y)
{
int r;
r=x+y;
return r;
}
- stack pointer register : Stack의 top을 가리키는 레지스터
- Stack이 올라가는 방향인지 내려가는 방향인지 방향을 정해야 함
- Intel process에서는 스택 바닥이 high memory를 가리키며 low memory방향으로 줄어듦
main:
pushl %ebp # 이전의 %ebp 값 저장 (스택 프레임 설정을 위해)
movl %esp, %ebp # %esp 값을 %ebp로 복사 (스택 프레임 시작)
subl $12, %esp # 스택에 12바이트 할당 (지역 변수 a, b, res를 저장할 공간)
movl $2, -4(%ebp) # 변수 a에 2를 저장
movl $13, -8(%ebp) # 변수 b에 13을 저장
movl -8(%ebp), %eax # 변수 b의 값을 %eax 레지스터로 복사
pushl %eax # %eax 값 (b) 을 스택에 푸시
movl -4(%ebp), %eax # 변수 a의 값을 %eax 레지스터로 복사
pushl %eax # %eax 값 (a) 을 스택에 푸시
call add # add 함수 호출
addl $8, %esp # 스택에서 8바이트를 정리 (매개변수 2개 제거)
movl %eax, %eax # add 함수의 반환값을 %eax에 저장 (실제 의미 없음, 단순히 %eax에 그대로 복사)
movl %eax, -12(%ebp) # 반환값을 변수 res에 저장
add:
pushl %ebp # 이전의 %ebp 값 저장 (add 함수의 스택 프레임 설정을 위해)
movl %esp, %ebp # %esp 값을 %ebp로 복사 (스택 프레임 시작)
subl $4, %esp # 스택에 4바이트 할당 (지역 변수 r을 저장할 공간)
movl 8(%ebp), %eax # 매개변수 x (a)의 값을 %eax 레지스터로 복사
movl 12(%ebp), %edx # 매개변수 y (b)의 값을 %edx 레지스터로 복사
leal (%edx, %eax), %ecx # %eax와 %edx 값을 더한 결과를 %ecx에 저장 (x + y 계산)
movl %ecx, -4(%ebp) # 계산된 결과를 지역 변수 r에 저장
movl -4(%ebp), %edx # r 값을 %edx 레지스터로 복사
movl %edx, %eax # %edx 값을 %eax로 복사 (결과를 반환 값으로 설정)
jmp .L2 # 함수 종료로 점프
.align 4
.L2:
movl %ebp, %esp # 이전의 %ebp 값을 %esp에 복사 (스택을 원래 상태로 복원)
popl %ebp # 이전 %ebp 값을 복원 (스택 프레임 종료)
ret # 함수 종료, 호출자에게 반환
- Formal parameter 스택에 메모리 할당 -> formal parameter에 actual parameter passing
- 스택의 formal parameter위한 메모리 공간 할당할 때 parameter 역순으로 할당 -> y,x순으로 할당됨
사이즈 형태 | 역할 | |
Data structure stack | Fixed size | 배열 기반 |
Main memory stack | Dynamic size | 함수 호출 흐름 관리 |
'강의 정리 > 운영체제 강의 정리' 카테고리의 다른 글
Operating Systems - Review of Computer Hardware (0) | 2024.11.04 |
---|---|
Operating Systems - History and Features (2) | 2024.10.31 |
K-MOOC '운영체제의 기초' 정리 (0) | 2024.10.31 |