패스트캠퍼스

[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 39회차 미션

돌맹이시터 2020. 11. 26. 12:29

 

 

환급미션 39일째...

 

 

 

운영체제 - 프로세스와 스케쥴러의 이해 - 12. 프로세스 구조와 힙

운영체제 - 프로세스와 스케쥴러의 이해 - 13. 프로세스 구조와 스택 오버플로우

운영체제 - 프로세스와 스케쥴러의 이해 - 14. 컨텍스트 스위칭 원리

운영체제 - 프로세스와 스케쥴러의 이해 - 15. 컨텍스트 스위칭 개념 정리

 

 

 

 

 

 

- Heap이란? 

 

 

 

heap - 동적으로 생성되는 메모리 부분

에 대해 조금 더 상세하게 다뤄볼 예정

 

예제에서 사용한 c언어로 작성된 코드

 

파이썬에서는 동적 메모리 할당은 생각할 필요가 없다.

하지만 내부적으로 컴퓨터를 세세하게 제어하려면 c언어만한 게 없다..

 

 

int *data;

정수형으로 공간이 필요하다는 것을 미리 알 수 있다. 

main 함수 내부에 선언되어 있으므로 함수 안에 있는 로컬변수처럼 취급되게 된다.

 

malloc() -> 동적으로 메모리 생성하는 함수, 인자로 사이즈를 받는다. stdlib.h 라이브러리 안에 있다.

위의 코드에서 malloc(sizeof(int))으로 쓰였으므로 통상적으로 32bit 의 공간만큼을 동적 메모리할당하게 된 셈이다.

 

이 포인터 변수에 주소를 타입캐스팅해서 (int *) 넣어주면 

data는 동적 메모리에 접근할 수 있는 변수가 된다.

-> data 변수는 heap 공간에 생성이 된다.

=> heap 영역에 32비트의 동적 메모리 공간이 만들어지게 되었다.

 

free(data);

함수가 끝날 때 fre(data)함수로 동적 메모리를 해제해야 한다.

 

*data=1;

위에서 만들어둔 데이터 공간에 1을 넣는다.

printf("%d\n", *data);

data 공간에 있는 값을 출력 (1)

 

 

 

다시 한 번 예제로 돌아와서

 

c언어로 작성한 프로그램을 실행하면

코드 영역에 들어가게 된다. 

 

1. STACK <- return address : 0006h

2. STACK <- int *data

3. HEAP <- data = (int*)malloc(sizeof(int)) ---- 그냥 32비트의 공간에 생성되는 것.

해당 주소값이 STACK-int *data에 들어가게 된다.

 

4. *data=1

-> STACK-data가 가리키는 주소값 (1000h)의 값이 1로 바뀐다.

 

 

5. data값 출력

6. 프로그램 종료

 

 

 

 

 

- 프로세스 구조 : Stack, HEAP, DATA (BSS,DATA), TEXT(CODE)

 

 

-> DATA영역 - BSS / DATA 두 가지 영역으로 분리

 

 

BSS (block started by symbol) - 초기화되지 않은 전역변수

DATA - 초기값이 있는 전역변수

 

 

 

c언어로 작성된 예시

 

 

global_data1

global_data2 

두 가지의 전역변수가 선언되어 있다.

global_data1 -> 선언만 되었다. 초기값x ===> BSS영역

global_data2 -> 1 값으로 초기화되어있다. 초기값o ===> DATA영역

 

(main함수 내에 선언된 지역변수도 있다.) int*data ===> Stackframe 영역

 

 

 

*스택 오버플로우 - 주로 해커들의 공격에 활용되었다.

 

 

지금까지의 예제와는 다르게

STACK의 가장 높은 주소를 아래에 두었다. (1000h)

 

코드를 살펴보면 

main함수에서 두 개의 인자를 디폴트로 받아오고,

이 중 한 인자를 copy라는 함수에 넘긴다.

 

지역변수인 char data[6] -> 6byte 스택공간 

strcpy (data,bar) -> 전달받은 인자를 그대로 복사

 

만약, bar 값에 6byte 이상의 문자를 넣게 된다면 

0FFFh, 1000h까지 넘어가면서 문자를 저장하게 된다.

1000h 자리에 들어가는 자리에 해킹을 할 수 있는 코드를 적어두게 되면 프로그램이나 운영체제를 해킹하게 될 수 있는 것이다.

 

-> 프로세스 구조를 이용해 (프로세스가 코드를 어떻게 동작할지를 알고 있기 때문에) 이런 해킹이 가능하게 되는 것이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

올인원 패키지 : 컴퓨터 공학 전공 필수👉https://bit.ly/3i4sCVE