HyeM

[컴퓨터구조]3주차(2)_메모리 구조 & 레지스터 종류 본문

Study/Computer Architecture

[컴퓨터구조]3주차(2)_메모리 구조 & 레지스터 종류

Hailey_HyeM207 2020. 5. 23. 03:12

메모리 구조

프로그램이 운영체제로부터 할당받는 대표적인 메모리공간(RAM)의 구조

코드 영역(Code ; 택스트영역)

실행할 프로그램의 코드가 저장되는 영역

CPU는 코드영역에 저장된 명령어를 하나씩 가져가서 처리한다.

 

- 프로그램 시작하고 끝날때 까지 메모리에 있음

- 기계어로 저장되어 있음

 

데이터 영역(Data)

프로그램의 전역변수와 정적변수, 문자열 상수가 저장되는 영역

- 데이터 영역은 프로그램의 시작과 함께 할당되고, 프로그램 종료시 소멸된다.

- 데이터 영역은 다시 네 개의 data segment로 나뉘는데, 각각 현재 모듈의 data structure, 상위 레벨로부터 받아들이는 데이터 모듈, 동적 생성 데이터, 다른 프로그램과 공유하는 공유데이터 부분이다.

 

 

힙영역(Heap)

사용자에 의해 메모리 공간이 동적으로 할당되고 해제되는 공간으로, 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당된다.

-> 사용자가 직접 관리해야 하는공간

- 런타임에 크기 결정됨

 

c언어에서는 malloc, c++에서는 new, delete 등

 

 

스택영역(Stack)

함수 호출과 관계되는 지역변수와 매개변수가 저장되는 영역이다.

 

프로세스에서 스택 메모리의 역할

1. 함수 내의 지역변수 임시저장

2. 함수 호출시 파라미터 전달 (매개변수 저장)

3. 복귀 주소(return address) 저장

 

- 스택영역은 함수 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다.

-> 스택프레임 : 스택영역에 저장되는 함수의 호출정보

- 컴파일시 크기결정됨.

- LIFO (후입선출) 방식에 따라 동작. ( 가장 늦게 저장된 데이터가 가장 먼저 인출됨)

- 메모리의 높은주소에서 낮은 주소 방향으로 할당됨.

  Push : 데이터 저장

  Pop : 데이터 인출

 

 

Stack vs Heap

1) Stack 영역이 클 수록 Heap 영역이 작아지고 Heap 영역이 클 수록 Stack 영역이 작아진다.

2) 스택 할당 속도& 힙 할당 속도 : 스택이 훨씬 빠르다. 
스택은 이미 할당되어 있는 공간을 사용하는 것이고, 힙은 사용자가 따로 사용하는 공간이다.

- 스택
에서 할당 : 이미 생성된 스택에 대해 포인터의 위치만 바꿔주는  단순한 CPU Instruction이다.
- 힙에서 할당 : 요청된 chunk의 크기, 현재 메모리의 fragmentation 상황 등 다양한 요소를 고려하기 때무에 더 많은 CPU Instruction이 필요

 

 

 

 


레지스터 

레지스터 : CPU 가 요청을 처리하는 데이터의 임시저장 공간

 

종류

1. 범용 레지스터 (32bit -8개)

2. 세그먼트 레지스터 (16bit -6개)

3. 플래그 레지스터 (32bit -1개)

4.  인스트럭션 포인터 (32bit -1개)

 

(IA-32레지스터와 8086CPU를 참고하여 조사하였다.)

 

 

 

1. 범용 레지스터

프로그래머가 임의로 조작할 수 있는 레지스터로, 

보통은 상수/주소등을 저장할 때 주로 사용되며, 특정 어셈블리 명령어에서는 특정 레지스터를 조작한다. 

또한 어떤 레지스터들은 특수한 용도로 사용되기도 한다.

범용 레지스터

(산술연산 명령어에서 상수/변수값의 저장 용도로 많이 사용됨)

EAX : 피연산자와 연산 결과의 저장, 함수 return 값  저장

EBX : 데이터 세그먼트 안의 데이터를 가리키는 포인터 ,산수/변수 저장

ECX : 문자열 처리나 루프를 위한 카운터

EDX : I/O 포인터, EAX를 보조하는 역할

        나누기 진행시, 몫은 EAX, 나머지는 EDX에 저장됨.

 

(메모리 복사에 이용)

ESI : DS레지스터가 가리키는 데이터 세그먼트  내의 어느 데이터를 가리키고 있는 포인터, 문자열 처리에서 source(출발지 주소)를 가리킴

EDI : ES레지스터가 가리키고 있는 데이터 세그먼트 내의 어느 데이터를 가리키고 있는 포인터, 문자열 처리에서 destination(목적지 주소)을 가리킴

stos, movs 사용할 때 마다 1씩 증가한다.

 

(스택관련)

ESP : SS 레지스터가 가리키는 스택 세그먼트의 맨 꼭대기를 가리킨다. 스택 쌓일때 마다 ESP 값 1씩 증가

EBP : SS레지스터가 가리키는 스택상의 한 데이터를 가리키는 포인터, 함수가 호출되었을 때, 그 순간의 EBP를 저장하고 있다가, 함수 리턴 직전에 ESP 값을 되돌려 줘야 함.( Stack Frame 기법) 

 

 

 

2. 세그먼트 레지스터 

세그먼트 : 메모리를 조각 내어 ,각 조각마다 시작주소, 범위, 접근 권한 등을 부여해서 메모리를 보호하는 기법이다. 

세그먼트 레지스터 : 프로세스의 특정 세그먼트를 가리키는 포인터 역할

세그먼트 레지스터

CS : Code Segment

SS : Stack Segment  // 이를 기반으로 원하는 segment 안의 특정 데이터, 명령어들을 정확하게 가져올수 있음

DS : Data Segment

 

ES : Extra(Data) Segment

FS : Data Segment

GS : Data Segment

 

ES, FS, GS 세그먼트는 추가적인 데이터 세그먼트이다.

 

 

 

3.  플래그 레지스터(EFLAGS)

총 32bit로, 각각의 비트마다 의미를 갖고 있고, 각 비트는 On/Off를 의미하는 1과 0의 값을 가진다.

일부 비트는 시스템에서 직접 세팅하고, 일부 비트는 프로그램에서 사용된 명령의 수행 결과에 따라 세팅된다.

플래그 레지스터는 상태 플래그, 컨트롤 플래그, 시스템 플래그들로 이루어졌다.

플래그 레지스터

상태 플래그

CF(Carry Flag) : 연산 수행하면서 자리올림(carry), 자리내림(borrow) 발생하면 1이 된다.

unsigned 변수의 오퍼플로우 발생시 1로 세팅됨.

     carry와 borrow는 덧셈 연산시 bit bound를 넘어가거나, 뺄셈하는데 빌려오는 경우

PF(Parity Flag) : 패리티체크하는데 사용됨

AF(Adjust Flag) : 연산결과 carry나 borrow가 3bit 이상 발생할 경우 1이 됨.

ZF(Zero Flag) : 연산결과가 0이면 1로 세팅됨. if문 같은 조건문 만족시 세팅된다.

SF(Sign Flag) : 연산 결과 최상위 비트값과 같다. Signed 변수일 경우, 양수이면 0, 음수이면 1이다

OF(Overflow Flag) : Signed변수의 오버플로우가 발생했을때, 1로 세팅된다. MSB(최상위비트)가 변경될 때, 1로 세팅됨

DF(Direction Flag) : 문자열 처리할때, 1일 경우 문자열 처리 instruction이 자동으로 감소, 0일 경우 자동으로 증가한다.

 

 

시스템 플래그 

IF, TF, IOPL, NT, RF, VM, AC, VIF, VIP, ID 

 

 

4. instruction 포인터 (EIP)

EIP : Instruction Pointer

cpu가 처리할 명령어의 주소를 나타내는 레지스터이다. 

다음에 실행해야 할 명령어가 존재하는 메모리 주소가 저장된다.

현재 명령어를 실행 완료한 후에, EIP 레지스터에 저장되어있는 주소에 위치한 명령어를 실행한다.

(실행전 EIP에는 다음 실행해야 할 명령어가 존재하는 주소값이 저장된다)

※ 범용레지스터와 달리 EIP는 그 값을 직접 변경못하고, 다른 명령어를 통하여 간접적으로 변경해야한다. 

 

 

 

 

 

 

참고 내용

[메모리 구조]

http://tcpschool.com/c/c_memory_structure 메모리의 구조

https://velog.io/@hidaehyunlee/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90  메모리 구조를 알아보자

 

[레지스터]

리버싱 핵심원리 (책) _ 이승원 지음

해커 지망자들이 알아야 할 Buffer Overflow Attack의 기초 _ 달고나

 

사진

범용 레지스터 (사진) 출처

https://securityfactory.tistory.com/182

세그먼트 레지스터 (사진) 출처

http://jackpark88.blogspot.com/2018/03/segment-register.html

플레그 레지스터 (사진) 출처

https://kimhyun2017.tistory.com/124

 


문제 출제

1. 다음 중 옳지 않은 보기를 고르시오.

(1) c언어에서 malloc과 관련된 메모리 영역은 힙 영역이다.
(2) 스택은 FIFO구조이고, 메모리의 높은 주소에서 낮은 주소 방향으로 할당된다.
(3) 힙영역은 낮은 주소에서 높은 주소로 할당된다.
(4) 코드영역은 실행 프로그램의 코드가 저장되는 영역으로, 기계어로 저장되어있다.
(5) 데이터영역은 정적변수와 문자열 상수가 저장되는 영역이다.

 

2. 다음을 설명하는 메모리 영역은 어디인가?

ESP와 EBP 레지스터(포인터)가 가리키는 곳으로, ESP는 ???이 쌓일때 마다 1씩 증가한다.

 

3. 다음 설명의 레지스터 이름은 무엇인가?

______ :  범용 레지스터와 달리 값을 직접 변경하지 못하는 레지스터로, CPU가 처리해야할 명령어의 주소를 나타내는 레지스터이다.

 

4. 다음 보기를 읽고, O,X 로 표기하시오. 

(1) 데이터 영역에는 지역변수와 정적변수가 저장된다.  ( O , X )

(2) 세그먼트 레지스터는 프로세스의 특정 세그먼트를 가리키는 포인터 역할로, 그 중 SS레지스터는 스택 Segment를 가리킨다. ( O , X )

 

5. <보기>에서 각 설명에 맞는 레지스터를 연결하시오.

(1) 문자열 처리나 루프를 위한 카운터역할의 레지스터

(2) 연산결과가 0이면 1로 세팅된다.

[    <보기> ZF, CF, ECX, EAX     ]

 

 

답은 밑의 더보기 클릭 

더보기

문제 답

1. 다음 중 옳지 않은 보기를 고르시오.

(1) c언어에서 malloc과 관련된 메모리 영역은 힙 영역이다.
힙영역은 메모리 공간이 동적으로 할당되고,해제되는 공간이므로, c언어의 메모리할당함수 malloc과 관련있다.
(2) 스택은 FIFO구조이고, 메모리의 높은 주소에서 낮은 주소 방향으로 할당된다.
스택은 FIFO구조가 아닌 LIFO 구조로, 가장 늦게 저장된 데이터가 가장 먼저 나오는 구조이다.
(3) 힙영역은 낮은 주소에서 높은 주소로 할당된다.
(4) 코드영역은 실행 프로그램의 코드가 저장되는 영역으로, 기계어로 저장되어있다.
코드영역은 또한 프로그램 시작하고 끝날때까지 메모리에 있다.
(5) 데이터영역은 정적변수와 문자열 상수가 저장되는 영역이다.

 

답 :  2번  

 

2. 다음을 설명하는 메모리 영역은 어디인가?

ESP와 EBP 레지스터(포인터)가 가리키는 곳으로, ESP는 ???이 쌓일때 마다 1씩 증가한다.

답 : __스택___  EBP 는 스택의 한 데이터를 가리키는포인터이고, ESP는 스택 세그먼트의 맨 꼭대기를 가리킨다.

 

 

3. 다음 설명의 레지스터 이름은 무엇인가?

__EIP__ :  범용 레지스터와 달리 값을 직접 변경하지 못하는 레지스터로, CPU가 처리해야할 명령어의 주소를 나타내는 레지스터이다.

 

 

4. 다음 보기를 읽고, O,X 로 표기하시오. 

(1) 데이터 영역에는 지역변수와 정적변수가 저장된다.  ( O , X )

x. 데이터 영역에는 지역변수가 아닌 전역변수와 정적변수가 저장된다.

스택영역에 저장되는것이 지역변수와 매개변수이다.

(2) 세그먼트 레지스터는 프로세스의 특정 세그먼트를 가리키는 포인터 역할로, 그 중 SS레지스터는 스택 Segment를 가리킨다. ( O , X )

O. SS는 Stack Segment의 약자로, 이 레지스터를 통해 원하는 segment 안의 특정데이터, 명령어들을 정확하게 가올 수 있다.

 

 

5. <보기>에서 각 설명에 맞는 레지스터를 연결하시오.

(1) 문자열 처리나 루프를 위한 카운터역할의 레지스터

(2) 연산결과가 0이면 1로 세팅된다.

[    <보기> ZF, CF, ECX, EAX     ]

(1) 답 : ECX, EAX는 피연산자와 연산 결과의 저장, 함수 return 값 저장하는 범용레지스터이다.

(1) 답 : ZF, ZF는 연산결과가 0이면 1로 세팅되고, if문 같은 조건문 만족시에도 세팅되는 플레그 레지스터이다.

CF : unsigned 변수의 오퍼플로우 발생시 1로 세팅되는 플레그 레지스터이다.

 

Comments