Tuuna Computer Science

컴퓨터 구조 ( Memory에 대해서 ) 본문

computer architecture

컴퓨터 구조 ( Memory에 대해서 )

GuTTe 2018. 10. 27. 13:08

메모리란 프로그램이 실행되는 동안 필요한 정보를 저장하는 곳을 의미한다. 

CPU는 이러한 메모리에 접근하기 위해서는 훨씬 느린 속도로 수행되는 System Bus를 통해 이루어진다. 

CPU의 처리는 빠른데 메모리로의 접근은 느리기 때문에 CPU는 피연산자가 메모리에서 인출될 때 까지 하나 이상의 사이클을 기다려야 하는 현재의 명령어를 실행 가능하다. 
이를 낭비 클럭 사이클이라 하며 "대기상태"라 불린다. 

그래서 이를 해결하기 위해 캐시 메모리라는 것이 탄생했다. 캐시메모리는 최근 사용된 명령어와 데이터를 저장하기 위해 만들어져 빠르게 접근이 가능하다. 

이제 프로그램이 어떻게 메모리에 올라와서 프로세스가 되는지에 대한 과정을 살펴보자 

내가 A라는 프로그램을 실행한다고 과정해보자 

1. OS는 A라는 파일 이름을 검색한다. 

2. 디스크 디렉토리에서 A파일에 대한 정보를 얻는다. 

3. 메모리의 사용가능한 위치를 확인한 후 사용 가능하면 적재한다. 

4. OS는 프로그램의 첫 번째 기계어 명령의 실행을 시작하게 된다. 즉, 프로세스가 되었다는 것을 의미 


[레지스터] 
=> CPU 바로 안에 있는 고속 저장 장소 

레지스터에는 EAX, EBX, ECX, EDX, EBP, ESP, EIP, ESI, EDI등의 레지스터가 있다. 

EAX와 EBX, ECX, EDX는 범용레지스터로써 목적이 뚜렷이 없다. (ECX는 루프를 돌릴 때 목적성을 지님) 

EBP와 ESP는 스택관련 레지스터인데 다음에 설명할 것이다. 

ESI와 EDI는 각 각 extend source index와 extend destination index를 의미한다. 

주로 문자열을 다룰 때 자주 사용되어 진다. 

:: Segment Register

16비트의 레지스터(미리 할당된 메모리 영역의 시작주소를 가리킨다.) 

CS : code-segment => 코드 세그먼트의 시작 주소 
DS : data-segment => 데이터 세그먼트의 시작 주소 
SS : stack-segment => 스택 세그먼트의 시작 주소 
ES : extra-segment => 문자 데이터의 시작 주소를 지정 
FS : 여분의 레지스터 카나리값 설정할 때 쓰이는 듯  
GS : 여분의 레지스터 카나리값 설정할 때 쓰이는 듯 

EFLAG Register :: CPU의 동작을 제어 & CPU의 연산 결과를 반영 

상태 플래그 => 산술연산 결과를 반영한다. 

CF :: unsigned number의 산술 연산의 결과가 클 때 set 
OF :: signed number의 산술 연산의 결과가 클 때 set 
SF :: 결과가 음수일 때 1로 설정 
ZF :: 결과가 0일 때 1로 설정 
PF :: 결과의 하위 바이트가 짝수개의 1인 비트들을 포함하면 1로 설정 (데이터 손실 가능성이 있을 때 오류검사로 사용)


우리가 사용하는 메모리는 보호모드일 확률이 99.8%지만 이 메모리에도 여러가지 모드가 존재한다. 

1. 가상 8086모드 :: 실제 주소 모드 소프트웨어를 안전한 멀티태스킹환경에서 실행가능하게 만들어 놓은 것이다. 

2. 시스템 관리 모드 :: 운영체제에게 전원관리와 시스템 보안과 같은 기능을 구현 

3. 실제 주소 모드 :: 시스템 메모리와 하드웨어 장치에 직접 접근할 필요가 있는 MS-DOS프로그램 실행하는데 사용 

0x00000 ~ 0xFFFFF (1MB)크기의 Memory공간을 지님. 또한 프로세서는 한 번의 하나의 프로그램만을 실행 
But, 인터럽트가 요청되면 처리한다. 또한, 응용프로그램은 시스템하드웨어에 직접 연결되는 주소 포함 + 어떠한 메모리에 위치도 허용! 

위에 설명한 것처럼 실제 주소 모드의 메모리는 20bit다 하지만 CPU는 2의 제곱으로 밖에 처리가 안된다 (2, 4, 8, 16, 32...) 

그래서 CPU는 16bit이지만 메모리는 20bit이기에 이를 해결할 방법을 찾는 것이 시급. 

그래서 Segmented Memory방식을 통해 해결하였다. Segment Memory는 메모리 공간을 64KB의 동일한 단위로 나누어 진다. 

64KB로 나누어진 메모리의 시작 부분을 세그먼트라 부르며 여기서 offset을 더해 메모리에 접근한다.

즉, segment *16 + offset의 방식을 사용한다.

그림으로 표시하자만

------------------- 0xF0000
|                        |
------------------- 0xE0000
|          .              |
|          .              |
|          .              |
------------------- 0x40000
|                        |
------------------- 0x30000
|                        |
------------------- 0x20000
|                        |
------------------- 0x10000
|         64KB        |
------------------- 0x00000

이렇게 모든 메모리가 64KB로 나뉘어 진다. 여기에 접근하려는 기준 세그먼트에 offset을 더하면 된다. 

즉, 8000:0250이라면 segment에 16을 곱한 80000세그먼트에 250만큼 떨어진 곳에 접근하다는 것 => 0x80250번지에 접근하겠다를 의미한다. 


4. 보호모드 :: 프로그램은 세그먼트라 불리는 분리된 메모리 영역이 주어지며 지정된 세그먼트 바깥에 참조하는 것을 방지 
(32비트 부호 모드에서는 태스크나 프로그램을 선형 주소 공간의 주소 4GB까지 지정가능하다.)
(IA-32 프로세서 계열(x86) : 32bit data register & 32bit address bus & 외부 데이터 버스를 통해 내부 데이터 경로와 구별 
또한 물리적 메모리 크기 보다 더 큰 가상 메모리의 주소 지정 가능 32bit 기준 4GB 

또한 여러 프로그램이 자신만의 가상메모리 영역에서 실행이 가능하다. => 고유 프로세스 모드 

세그먼트 레지스터를 통해 CPU가 segment를 추적한다. 

CS, DS, SS의 각 각의 서술자 테이블을 참조한다. 

균일 세그먼트 모델 = 모든 세그먼트는 컴퓨터의 32bit 물리적 주소 공간 전체에 매핑된다. 
하나의 코드, 데이터에 대해서 적어도 두 개의 세그먼트 필요 

각 세그먼트는 전역 서술자 테이블에 저장되는 64bit 정수인 세그먼트 서술자로 정의 

base-address-field : 사용할 수 있는 메모리의 첫 번째 주소를 가리킴 
limit : 한계 
access : 어떻게 사용될 수 있는지 결정 

다중 세그먼트 모델 = 지역 서술자 테이블이라는 자신의 세그먼트 테이블이 주어진다. 
자신의 주소공간을 갖음 + 세그먼트의 정확한 크기 명시 

[페이징] 

x86프로세서는 세그먼트를 page라 불리는 4KB의 메모리 블록으로 나눌 수 있게 하는 paging을 지원한다. 

초기 프로그래머는 적은 메모리 공간을 효율적으로 사용할 수 있도록 코드를 작성해야 했었다. 하지만 Virtual memory manager
즉, 가상메모리가 개발되면서 프로그래머는 이러한 제한에 벗어날 수 있게 되었다. 

이 가상메모리를 통해 프로세스마다 독립적으로 실행 시킬 수 있게 되었다. ( DISK에 데이터를 저장하는 방식을 통해 ) 

테스크가 실행 중일 때에 일부분이 현재 사용중이 아니라면 디스크에 저장(페이징(swap)) 필요하다면 반대로 디스크에서 메모리로 맵핑 

프로세스가 메모리에서 페이징되어 나간 코드를 실행하기  시작할 떄 Page Fault에러를 일으키게 된다. 


[메모리의 종류] 

ROM : read-only-memory(읽기 전용)
DRAM : dynamic-RAM (주 메모리) 
SRAM : static-RAM (고속 캐시 메모리)
VRAM : video-RAM (비디오 데이터 저장 메모리) => 이중 포트 사용 -> 속 화면 재생 & 화면에 표시할 데이터를 쓴다

마지막으로 application과 os, bios, hadware가 어떻게 통신하는지 살펴보겠다. 

먼저 장치드라이버는 OS - Hadware 장치와 직접 통신을하는 저수준 서브루틴의 집합을 의미한다. 

BIOS는 하드웨어 장치와 직접 통신을 하는 저수준을 의미 

1. Applitcation Program : 응용프로그램에서 문자열을 출력하는 API호출 => API는 문자열 포인터를 넘기면서 OS 호출 

2. OS Function  :  OS 함수는 ASCII코드와 문자 색상을 넘기면서 BIOS 서브루틴 호출 & 커서가 화면의 다음 위치로 진행하도록 하는 BIOS 서브루틴 호출

3. BIOS Function : BIOS 서브루틴은 문자를 붇고 특별한 시스템 폰트로 맵핑하고 문자를 비디오 제어 카드에 지정된 하드웨어 포트로 전송 

4. Hadware  : 비디오 제어카드는 래스터 스캔과 픽셀표시를 제어하도록 타이밍을 제공하는 하드웨어 신호 생성 


http://itguava.tistory.com/6?category=630867





























Comments