yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

8086 Memory Architecture, register 본문

컴퓨터 시스템

8086 Memory Architecture, register

yehey 2020. 9. 6. 01:06

 

8086 Memory Architecture

8출처: (달고나)와우해커 BOF 기초문서

시스템이 초기화되면 시스템은 커널을 메모리에 적재, 가용 메모리 영역(available space)를 확인한다.

시스템은 운영에 필요한 기본적인 명령어 집합을 커널에서 찾기 때문에 커널은 반드시 저 위치에 존재해야한다.

 

32bit 시스템
:CPU가 한꺼번에 처리할 수 있는 데이터가 32bit단위로 되어 있기 때문에 메모리 영역에 주소를 할당할 수 있는 범위가 0~(2^32)-1 이다.

64bit 시스템
:CPU가 64bit씩 처리할 수 있으므로 메모리 영역의 범위 는 0~(2^64)-1 이 된다.

 

출처: (달고나)와우해커 BOF 기초문서

 

위와 같이 운영체제는 하나의 프로세스를 실행시키면 프로세스를  segment라는 단위로 묶어서 가용 메모리 영역에 저장시킨다. 오늘날 시스템은 멀티 태스킹(multi-tasking)이 가능하기 때문에 메모리에는 여러 개의 프로세스가 저장되어 병렬적으로 작업을 수행할 수 있다.

-> 가용 메모리 영역에 여러 개의 segment들이 저장될 수 있다.

 

멀티 태스킹(multi-tasking)
:다수의 프로세스가 CPU와 같은 공용자원을 나누어 사용하는 것

 

Segment

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

:최대 2^32byte 크기를 갖는다.

:하나의 segment는 code segment, data segment, stack segment로 구성되어 있다.

 

Code segment

:시스템이 알아들을 수 있는 명령어, instruction등이 있다.

:어셈블리어가 기계어가 되어 들어가는 부분!

 

instruction은 분기과정과 점프를 수행하는데, 이 과정에서 메모리 상의 특정 위치에 있는 명령을 지정해주어야한다.

그러나 Segment는 실행 시점에 실제 메모리의 어느 위치에 저장될 지 결정되기 때문에

컴파일 과정에서는 어느 위치에 저장될 지 알 수 없어서 정확한 메모리 주소를 지정할 수 없다.

 

->logical address를 사용한다.

 

Segment 구조와 logical address

 

local address를 통해 실제 physical address 구하는 방법

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

또한 Segment는 segment selector에 의해 자신의 시작위치 (offset)을 알 수 있다.

따라서 Segement는 시작위치(offset)로부터 상대적인 위치(local address)에 있는 명령을 수행할 지 결정한다.

 

실제 physical address = offset + logical address

위의 그림을 예시로 IS1의 실제 메모리상 주소를 찾아보자.
0x80010000(offset) + 0x00000100(logical address) = 0x80010100(physical address, 실제 메모리 상의 주소)

Data segment

:프로그램 실행시에 사용되는 전역변수들이 들어가는 공간

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

 

Stack segment

:현재 수행되고 있는 handler, task, program이 저장하는 데이터 영역(즉, 버퍼가 자리잡는 영역)

:프로그램이 사용하는 multiple 스택을 생성 (스택들 간의 switch 가능)

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

:Last In First Out 구조

 

-스택은 처음 새성될 때 필요한 크기만큼 만들어지고 프로세스 명령에 의해 데이터를 저장해 나가는 과정을 거치게 된다.

-SP(stack pointer) 레지스터가 스택의 맨 꼭대기를 가리키고 있어 이를 이용해 스택에 데이터 저장,읽기 가능

-SP가 가리키는 곳까지가 데이터가 채워진 영역!

 


 

8086 CPU 레지스터 구조

CPU가 프로세스를 실행하기 위해서 프로세스를 CPU에 적재시킨다.

흩어져 있는 명령어 집합과 데이터들을 적절하게 처리 및 저장하기 위해 CPU 내부에 존재하는 메모리를 사용한다.

->CPU 내부에 존재하는 저장공간을 레지스터라고 한다.

 

레지스터는 범용 레지스터, 세그먼트 레지스터, 플래그 레지스터, 인스트럭션(instruction) 포인터로 구성된다. 

 

레지스터 구조, 출처: (달고나)와우해커 BOF 기초

범용 레지스터

: 프로그래머가 임의로 조작할 수 있게 허용되어 있는 레지스터

: 논리연산, 수리연산에 사용되는 피연산자, 주소를 계산하는데 사용되는 피연산자 메모리 포인터가 저장된다.

범용 레지스터의 종류는 다음 글에서 더 자세히 다루고 있다.

2020/09/06 - [컴퓨터 시스템] - 어셈블리어 명령어와 범용 레지스터

 

세그먼트 레지스터

:특정 세그먼트를 가리키는 포인터 역할을 한다.

:code segment, data segment, stack segment를 가리키는 주소가 들어가 있다.

  • CS (code segment): 코드 세그먼트의 시작주소

  • DS (data segment): 데이터 세그먼트의 시작주소, 데이터의 위치를 알아낸다.

  • SS (stack segment): 스택 세그먼트의 시작 주소, 메모리 상에 스택 구현을 가능하게 함, 주소와 데이터 임시 저장목적으로 스택을 사용.

  • ES: 메모리 주소지정을 다루는 문자 데이터 연산에서 사용

  • FS, GS: 기억장소 요구사항을 다룬다.

플래그 레지스터

:0,1로 상태를 나타내는 레지스터

:Status Flag와 System Flag로 나뉜다.

 

status flags 종류와 역할, 출처:(달고나)와우해커 BOF 기초

 

 

system flags 종류와 역할, 출처:(달고나)와우해커 BOF 기초

Instruction Pointer 

:다음 실행할 명령어가 있는 현재 code segment의 offset(시작위치) 값을 가진다.

:하나의 명령어 범위에서 선형 명령 집합의 다음 위치를 가리킬 수 있다.

:control-transfer instruction(JMP, Jcc, CALL, RET)와 IRET instruction이 있는 주소값을 가진다.

EIP register (Extended Instruction register)

:확장된 명령지시자, CPU에게 다음 할 일을 전달, 다음 할 일을 기억

:소프트웨어에 의해 바로 엑세스 불가능 (control-transfer instruction이나 inerrupt, exception에 의해 제어됨)

 

=>Instruction pointer 값을 수정한다면 EIP 레지스터의 값을 간접적으로 지정할 수 있음

따라서 CPU의 다음 할 일을 임의로 바꿀 수 있다.

(Instruction pointer의 값을 수정해서 CPU에게 원래 해야하는 일이 아닌 우리가 만든 코드를 실행하도록 하면 해킹성공!)

 

 

출처: (달고나)와우해커 BOF 기초

'컴퓨터 시스템' 카테고리의 다른 글

gdb 명령어 모음  (0) 2020.09.07
gdb 사용하기  (0) 2020.09.06
어셈블리어 명령어와 범용 레지스터  (0) 2020.09.06
컴퓨터 시스템의 기초  (0) 2020.09.05
Comments