본문 바로가기
기타/달고나 문서

8086 Memory Architecture & 8086 CPU 레지스터 구조

by laoching 2015. 2. 19.
728x90
반응형

이 문서는 구글에 달고나 문서라고만 검색을 해도 나온다.

이 문서는 Buffer Overflow 공격에 대한 원리와 관련 지식을 모았다.


<8086 Memory Architecture>

8086 시스템의 기본적인 메모리 구조는 위 그림과 같다.

[8086? :

인텔사에서 개발한 16비트 마이크로프로세서이며, x86 아키텍처를 적용한 첫 제품이다.]

시스템이 초기화 되기 시작하면 시스템은 커널을 메모리에 적재시키고

가용 메모리 영역을 확인하게 된다.

시스템은 운영에 필요한 기본적인 명령어 집합을 커널에서 찾는다.

그래서 커널 영역은 반드시 저 위치에 있어야 한다고 한다.

커널은 64KByte 영역에 자리잡지만 이를 확장하여 오늘날의 운영체제들은 더 큰 영역을 차지한다.

32bit 시스템에서는 CPU가 한꺼번에 처리할 수 있는 데이터가 32bit 단위로 되어있다.

64bit 시스템에도 64bit로 되어 있다.

메모리 영역에 주소를 할당할 수 있는 범위가

32bit : 2^32-1

64bit : 2^64-1 이다.


[프로그램이 실행되기 위한 메모리 구조]

운영체제는 하나의 프로세스를 실행시키면 이 프로세스를 segment라는 단위로 묶어서 가용 메모리에 영역에 저장시킨다.

위 그림과 같이 시스템은 멀티테스킹이 가능하다.

그래서 메모리에는 여러 개의 프로세스가 저장되어 병렬적으로 작업을 수행한다.

segment는 프로세스를 묶은 것으로 실행 시점에 실제 메모리의 어느 위치에 저장될 지가 결정된다.

[예 :

int a=1;

로 선언을 했을 때 4바이트만큼 a가 들어가야 한다. (int는 4바이트)

그게 Stack과 Data와 Code중에 어디로 들어갈지 결정한다는 말이다.]


하나의 segment는 위 그림의 오른쪽과 같은 구조를 갖고있다.

각각을 Stack segment, Data segment, Code segment라고 한다.

시스템에는 최대 16,383개의 segment가 생성될 수 있고

그 크기와 타입은 다양하게 생성될 수 있다.

그리고 하나의 segment는 최대 2^32byte의 크기를 가질 수 있다.


[Code segment]

시트템이 알아들을 수 있는 명령어들이 들어 있다. instruction이라고 한다.

이것은 기계어 코드로 컴파일러가 만들어낸 코드다.

instruction들은 명령을 수행하면서 많은 분기 과정과 점프, 시스템 호출등을 수행한다.

분기와 점프의 경우 메모리 상의 특정 위치에 명령을 지정해 주어야 한다.

[분기? :

프로그램의 실행순서를 변경하여 다른 명령을 실행할 수 있도록 하는 것.

[네이버 지식백과] 분기 [branch] (컴퓨터인터넷IT용어대사전, 2011.1.20, 일진사)

<분기의 예> 출처 : 네이버]


하지만 segment는 자신이 메모리상에 어느 위치에 저장될지 컴파일 과정에서는 알 수 없기 때문에 정확한 주소를 지정할 수 없다.

그래서 segment에서는 logical address를 사용한다.

Logical address는 실제 메모리 상의 주소와 매핑이 되어 있다.

즉 segment는 segment selector에 의해 자신의 시작 위치(offset)를 찾을 수 있고

자신의 시작 위치(logical address)로부터 위치에 있는 명령을 수행할 지를 결정하게 되는 것이다.

실제 메모리 주소 physical address 는 offset+logical address 라고 할 수 있다.

그림과 같이 segment가 실제로 위치하고 있는 메모리상의 주소를 0x80010000이라고 가정하자.

codesegment 내에 들어 있는 하나의 instruction IS 1를 가리키는 주소는 0x00000100이다.

이것은 logical address 이고 이 instruction의 실제 메모리 상의 주소는

segment offset인 0x80010000과 segment내의 주소 0x00000100을 더한 0x80010100이 된다.

따라서 segment가 메모리상의 어느 위치에 있더라도 segment selector가 segment offset을 알아내어 해당 instruction의 정확한 위치를 찾아낼 수 있게 된다.


[Data segment]

프로그램 실행시 사용되는 데이터가 들어간다.

여기서 말하는 데이터들은 전역 변수들이다.

[전역 변수? :

어떤 변수 영역에서나 사용될 수 있는 변수를 말한다.

반대로는 지역 변수가 있다.]

프로그램 내에서 전역 변수를 선언하면 그 변수가 data segment에 자리잡는다.

data segment는 다시 네 개의 data segment로 나뉘는데

각각 현재 모듈의 data structure, 상위 레벨로부터 받아들이는 데이터 모듈, 동적 생성 데이터, 다른 프로그램과 공유하는 공유 데이터 부분이다.


[Stack segment]

현재 수행되고 있는 handler, task, program이 저장하는 데이터 영역

우리가 사용하는 버퍼가 stack segment에 자리잡는다.

또 프로그램이 사용하는 multiple 스택을 생성할 수 있고 각 스택들간의 switch가 가능하다.

지역 변수들이 자리잡는 공간이다.

[multiple 스택? :

기존 배열 스택은 처음에 크기가 고정되어있다는 단점이 있다.

multiple 스택은 그 단점을 조금이나마 줄이고자 한다.]


stack pointer(SP)라고 하는 레지스터가 스택의 맨 위를 가리키고 있다.

스택에 데이터를 저장하고 읽어 들이는 과정을 PUSH 와 POP instruction에 의해 수행된다.

[스택 :

LIFO > Last In First Out

나중에 들어갓것이 먼저 나간다는 스택의 구조다.

출처 : 위키백과

PUSH하면 들어가고 POP하면 나온다.]

728x90
반응형

'기타 > 달고나 문서' 카테고리의 다른 글

8086 CPU 레지스터 구조  (0) 2015.02.27

댓글