[운영체제] 프로그램의 구조
학부때 배운 내용 복습겸 정리 시작
운영체제부터
- 프로그램의 구조
프로그램의 구조를 그려보면 아래와 같다
프로세스제어블록이 0번지부터 시작하고,
스택은 제일 마지막 번지부터 거꾸로 올라가면서 주소를 차지한다
실제 코드와 비교해서 보면 더 알기 쉽다
아래와 같은 코드가 있다고 치자
----------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int data1 = 1, data2 = 2, data3 = 3
int main(void)
{
int hi, hello, annyung;
int *p1;
hi = data1 + data2;
hello = data2 + data3;
annyung = func1(hi);
p1 = (int*)malloc(sizeof(int)*annyung);
}
int func1(int a) {
int hi = 0, hello = 10, data3 = 100;
hi = a * 2;
hello = hi * data3;
data2 = hello - data3;
return hi;
}
----------------------------------------------------------------------------
- 우선적으로 이 코드자체는 텍스트(코드,명령어)에 들어가게 된다
- 실제 데이터(전역변수)는 main함수 위에 선언된 data1, data2, data3이다
- 스택(지역변수,매개변수)는 main함수에서 hi, hello, annyung,
func1함수에서 hi, hello, data3 이다
(여기서 hi, hello는 main함수의 그것과는 다른 변수이다)
- 마지막으로 힙(동적 메모리 할당)은 malloc으로 정해준 사이즈만큼 메모리를 할당받은 p1 이다
심심하기도 하고, 코드 몇줄 친 노력이 가상하니 각 변수에 대해 값을 계산해보자
<데이터>
data1(전역변수) = 1
data2(전역변수) = 2 -> 500(func1)
data3(전역변수) = 3
<힙>
p1부터 시작된 메모리 사이즈 = 24
<스택>
data3(func1) = 100
hello(func1) = 10 -> 600
hi(func1) = 0 -> 6
a(func1) = 3
annyung(main) = ? -> 6(func1)
hello(main) = 5
hi(main) = 3
보시다시피 프로그램 구조에 맞춰서 정리해보았다
그런데 스택에서는 main함수부터 차례로 나오게 되는 func1까지의 변수를 거꾸로 써놓았다
위에 썼다 시피 스택은 제일 마지막 번지부터 거꾸로 올라가면서 주소를 차지하기 때문
**p1의 메모리 사이즈 크기가 24인 이유는
malloc함수에 int자료형의 크기*annyung 값을 넣었기 때문
int자료형=4byte, annyung=6
이므로
24
가 된다
다시 프로그램 구조 얘기로 돌아와서
실제 힙과 스택 사이에는 여유 메모리 공간이 존재하지만
계속해서 동적메모리를 할당하여 힙을 늘리고,
함수를 연이어 호출하여 지역변수를 계속 계속 선언하며 스택을 늘리면,
여유메모리 공간이 없어저 오버플로가 발생
또는
데이터(전역변수)에 장난을 쳐서 텍스트영역을 침범
할 수 있다.
이 내용인 즉
실제로 프로그램이 동작하면서 예상치 못한 상황을 발생 시킬 수 있는 껀수
가 있다는 말
해킹같은데 이용이 된다
예를들어
동적메모리 할당을 입력받은 값의 크기에 따라 잡도록 해놨는데
입력받는 값의 제한이 없을때
임의로 아주 메모리 공간을 많이 차지하는 입력값을 주어서
스택 영역을 침범!!
-> 지역변수의 값을 임의로 바꿔서, 다른 결과값을 만들어 낼 수도 있음
물론 실제로 저렇게 할려면 공부 많이해야된다
이정도 했으니
끝