Search

스택 프레임

class
운영체제 심화
상태
완료
날짜
목차

C#에서 스택 프레임의 구성

1.
매개변수
함수가 호출될 때 호출자가 전달하는 값
스택 프레임의 상단에 위치하며, 함수 내부에서 읽기 가능
2.
지역 변수
함수 내부에서 선언된 변수
호출 시 스택 프레임에 저장되며, 함수 종료 시 자동으로 메모리에서 제거
3.
리턴 주소
호출 함수가 종료된 후 호출한 지점으로 돌아가기 위한 주소
4.
Saved Registers
함수 호출 시 호출자의 레지스터 상태를 저장

C#에서 매개변수와 지역 변수 찾기

C# 코드 간단한 예시
void ExampleFunction(int param1, int param2) { int localVar1 = param1 + param2; int localVar2 = localVar1 * 2; }
C#
복사
C# → JIT 컴파일러로 변환한 어셈블리어 (IL언어 생략)
push ebp ; 이전 함수의 EBP 저장 mov ebp, esp ; 현재 함수의 스택 프레임 설정 sub esp, 8 ; 지역 변수 공간 확보 (예: 2개 정수 변수) mov eax, [ebp+8] ; 매개변수 param1 로드 mov ebx, [ebp+12] ; 매개변수 param2 로드 add eax, ebx ; param1 + param2 계산 mov [ebp-4], eax ; 결과를 localVar1에 저장 mov eax, [ebp-4] ; localVar1 로드 imul eax, 2 ; localVar1 * 2 계산 mov [ebp-8], eax ; 결과를 localVar2에 저장 mov esp, ebp ; 스택 포인터 복구 pop ebp ; 이전 스택 프레임 복구 ret ; 호출자로 복귀
Assembly
복사
위 내용은 32비트 운영체제의 어셈블리어로 간단한 예시를 설명했습니다. 가장 주목할 점은 숫자들입니다. 이 숫자들은 스택 프레임의 실제 주소를 나타내는 값으로, 각 변수의 크기를 기반으로 위치가 결정됩니다. 따라서 변수의 크기를 알아야만 스택 프레임에서 활용할 수 있습니다.

ARM64 아키텍쳐에서의 스택 프레임

이 부분은 Android나 iOS와 같은 모바일 환경에서 주로 사용하는 ARM64 아키텍처입니다.
간단하게 보고 넘어가시면 좋겠습니다. 가장 중요한 점은 스택 프레임에서 변수들을 사용할 때, 해당 변수의 크기를 컴파일 단계에서 명확히 알 수 있어야 한다는 것입니다.
int add(int a, int b) { int result = a + b; return result; }
C#
복사
// 함수 프로로그 add: stp x29, x30, [sp, #-16]! // x29(Frame Pointer), x30(Return Address) 저장 mov x29, sp // Frame Pointer 설정 // 매개변수 a(x0), b(x1) 로드 및 계산 add w2, w0, w1 // w2 = a + b // 결과 저장 및 반환 mov w0, w2 // 결과를 반환값 레지스터(w0)에 저장 // 함수 에필로그 ldp x29, x30, [sp], #16 // Frame Pointer 및 Return Address 복구 ret // 호출자로 반환
Assembly
복사