'프로그래밍/WinSysProgram'에 해당되는 글 4건

  1. 2015.01.18 가상 메모리 (2)
  2. 2015.01.16 가상메모리 (1)
  3. 2014.10.25 16비트 CPU 명령어 설계
  4. 2014.10.25 간단한 CPU 구조

가상 메모리를 RAM보다 더 큰 크기로 할당 할 수 있는 비밀은 HDD의 일부를 SWAP FILE로 사용하여 RAM의 상태를 저장하는데 있다. 이 부분에 대해서 정리한 파일을 올려본다. 사진은 보고 있는 "뇌를 자극하는 Windows System Programming"에서 발췌하였다.

 

 

 

 

 

 

'프로그래밍 > WinSysProgram' 카테고리의 다른 글

가상메모리 (1)  (0) 2015.01.16
16비트 CPU 명령어 설계  (0) 2014.10.25
간단한 CPU 구조  (0) 2014.10.25
Posted by 굿쟌
,

 뇌를 자극하는 Windows 시스템 프로그래밍에서 가상 메모리에 대한 내용 즉, "어떻게 각 프로세스에게 실제 메인 메모리 ( RAM ) 용량보다 많은 메모리를 할당 할 수 있는가"에 대한 해답을 정리한 내용이다.

 

공부를 할 수록 그동안 모르고 있던 것을 알게되어 기쁘다. 사실 현업에서는 별 필요 없는 이론적인 이야기지만, 그동안 몰랐던 것을 알게되니 안보이던 것들이 보여 시야가 넓어지는 기분이다.

 

 

 

'프로그래밍 > WinSysProgram' 카테고리의 다른 글

가상 메모리 (2)  (0) 2015.01.18
16비트 CPU 명령어 설계  (0) 2014.10.25
간단한 CPU 구조  (0) 2014.10.25
Posted by 굿쟌
,

32비트 CPU이니 64비트 CPU이니 하는 것은

첫째로 한번에 얼마나 많은 비트수를 CPU로 전달할 수 있느냐?

둘째로 한번에 얼마나 많은 비트수를 CPU에서 처리 할 수 있느냐?

의 문제이다.

 

예를 들자면 16비트 CPU경우, 최대 16비트짜리 정보를 가져와 처리 할 수 있는데, 이 정보라는 것은 컨트롤 유닛이 처리할 명령어 일수도, 혹은 메인 메모리 어딘가를 가리키는 주소값일 수 있다.

 

따라서 16비트 CPU의 경우에, 가지고 놀 수 있는 메모리 주소 범위는 0x0000 ~ 0xFFFF까지가 되고 컨트롤 유닛이 처리 할 수 있는 최대 명령어 크기는 16비트가 된다.

 

그럼 이제 16비트 CPU라는 가정하에 CPU, 정확히는 컨트롤 유닛이 처리 할 수 있는 16비트 짜리 명령어를 설계해보자.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reserved       명령어         저장레지스터  flag         인자1        flag        인자2

   2 bit             3 bit                 3 bit        1bit          3bit          1bit         3bit

 

처음 2비트는 이후 사용을 위해 보류해놓은 비트다. 이후에 Indirect 모드 사용에 사용된다.

다음 3bit는 명령어 정보이다. 총 8개의 명령어를 표현한다. 000 ~ 111

인자 1, 인자 2에 들어 있는 정보를 가지고 수행 한 값을 저장할 레지스터이다.

인자 1,2 앞에 붙어 있는 값은 인자가 레지스터 정보인지 아니면 0~7사이의 값인지 표현한다.

 

예를 들어,

 

인자 1, 인자 2를 더해라 라는 명령어를 0 0 1

flag값 0을 실제 값, 1을 레지스터로

약속하면..

 

"레지스터 1과 레지스터 2를 더해서 레지스터 0에 저장해라"

"ADD r0, r1, r2" 라는 명령어는 아래와 같다.

 

1

0

 

그럼, "레지스터 1의 값과 4를 더해서 레지스터 0에 저장해라"

"ADD r0, r1, 4" 라는 명령어는? 아래와 같다.

 

1

0

0

 

사실 프로그램이라는 것은 이렇게 CPU가 수행해야 할 명령어들의 모임이라고 봐도 좋다.

이런 명령어를 컨트롤 유닛이 해석하고 그에 합당한 ALU의 동작을 지시한다.

 

이런 프로그램의 명령들은 실행하기 전에는 HDD에 저장되어 있으며, 실행시키게 되면 메인 메모리 상으로 올라오게 된다. 메인 메모리 상의 이 명령어들은 레지스터중 하나인 IR (Instruction Resister)로 전송되어 컨트롤 유닛에 의해 해석되고, 이에 합당한 ALU의 동작이 시행된다. (참고로 ALU의 동작은 무조건 레지스터를 대상으로만 이뤄진다.)

 

 

자, 그럼 이제 레지스터의 값을 메인 메모리 상에 저장하거나, 메모리상의 값을 레지스터로 불러오는 명령어를 설계해보자.

 

먼저 메모리->레지스터 LOAD 명령어는 010으로 한다.

그리고 레지스터->메모리 STORE 명령어는 011로 한다.

다음 3비트는 레지스터 정보.

그리고 마지막 8비트 0x00 ~ 0xFF는 메모리 주소

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reserved      명령어         저장레지스터                   메인메모리 주소

 

참고로, 메인 메모리 주소는 16비트당 1개씩 올라가고, 레지스터또한 16bit라고 가정한다.

 

그런데 여기서 문제가 있다.

메인 메모리 주소는 16bit 컴퓨터에서 0x0000~0xFFFF까지 인데도,

이 명령어 구조로는 메모리 주소 표현을 위해 8bit밖에 쓰지 못하기 때문에

0x00 ~ 0xFF까지만 접근이 가능하고 그 이후의

0x0100 ~ 0xFFFF까지의 메모리는 접근을 못하는 것이다.

 

그래서 이 명령어 구조를 유지하면서도 모든 메모리 구조를 접근가능 하게 하기 위해서 Indirect mode라는 것이 나왔다.

 

Indirect mode는 아래 그림과 같이 이 명령어 구조로 사용할 수 있는 메모리 주소 0x00 ~ 0xFF의 위치에 저장되어 있는 16비트 값 (0x0000 ~ 0xFFFF)를 메모리 주소로 사용 하겠다는 아이디어다.

 

Indirect Mode는 표시하기 위해 앞으로 우리는 아껴두었던 처음 2bit Reserved bit를 11로 채움으로써 표현 하기로 약속해 보자

 

 

위에 있는 사진은

 

STORE r1,[0x01] 을 의미한다.

(참고로 과로 []는 이 주소값을 indirect모드로 사용한다는 의미이다.]

 

즉, 1번 레지스터에 저장된 10이라는 값을 메인메모리 0x0010에 저장된 값을 메모리 주소로 가지는 메모리 위치에 저장한다는 것이다.  0x0010에는 0x0030이라는 값이 저장되어 있고 0x0030을 메모리 주소로 가지는 0x0030의 16비트에 10의 값을 저장하는 것이다.

 

그런데 여기서 좀 오해를 일으킬 수 있는 여지가 있는데, 이부분을 직접 바이너리 코드를 작성해 보며 살펴 보겠다.

 

먼저 STORE r1, [0x01]을 16비트 명령어로 표현해보자

 

 1

 0

 0

 1

Reserved      명령어         저장레지스터                   메인메모리 주소

 

이 명령어 마지막 8비트로 표현된 주소는 8비트 이므로 0x01 이다. 그런데 실제로 이 값에 메칭되는 메인 메모리 주소는 0x0001로 매칭된다. 이부분이 햇갈릴 수 있으나, 명령어 상의 8비트 주소는 16비트 주소의 앞 8비트가 00이라는 가정하에 메인메모리로 매칭 된다고 생각하면 쉬울 것 같다. 왜 그런지의 문제가 아니라 그러기로 약속 했다는 의미랄까?

 

그리고 메인메모리 0x0001에 저장되어 있는 값은 사실상 0x30이 아니다. 메모리에 저장되어 있는 값 또한 16비트 이기 때문에 0x0030이라고 해야 맞다. 따라서 저장하고자 하는 레지스터 1의 값은 0x30이 아니라 0x0030에 저장된다.

 

그럼 이제, 마지막으로 다음과 같은 시나리오를 직접 컨트롤 유닛이 Decode 할 수 있는 명령어로 표현해 봄으로 써 이 포스트를 마무리 해 보자.

 

목표.

메모리 0x0010에 저장 된 값과 0x0020에 저장 된 값을 더해 0x0100에 저장한다.

 

어셈블리. & 바이너리.

1. MUL r2, 4, 4

 

 (MUL의 명령어는 1 0 0으로 한다.)

0

0

0

 

2. MUL r3, 4, 4

 

0

0

0

 

3. MUL r0, r2, r3 -> 이상태에서 r0에 256, 0x0100이 저장된다.

 

0

0

1

 

4. STORE r0, 0x30 -> 이상태에서 메인메모리 0x0030에 0x0100이 저장된다.

 

0

 0

 0

0

 

4. LOAD r1, 0x10

 

0

 0

 0

0

 

5. LOAD r2, 0x20

 

0

 0

 0

0

 

6. ADD r3, r1, r2 -> r3에 0x0010에 저장 된 값과 0x0020에 저장된 값의 합이 저장된다.

 

1

1

0

 

7. STORE r3, [0x30] -> 0x0030에 저장된 0x0100을 주소값으로 하는 16비트 메모리 위치에

                                  r3가 가지고 있는 16bit값을 저장한다.

 

1

 0

1

 0

0

 

     -> 실제로 이 r3에 저장된 값은 메인메모리 0x0030에 저장된 0x0100을 주소값으로

          가지는 메모리 주소에 저장된다.

 

이러한 indirect mode를 통해, 비록 8bit밖에 안되는 정보공간을 통해서도 16bit 메모리 주소를 관리할 수 있게 되었다. 참 세상엔 똑똑한 사람들이 많은 것 같다.

 

-끝-

'프로그래밍 > WinSysProgram' 카테고리의 다른 글

가상 메모리 (2)  (0) 2015.01.18
가상메모리 (1)  (0) 2015.01.16
간단한 CPU 구조  (0) 2014.10.25
Posted by 굿쟌
,

 먼저 사진들의 출처는 한빛미디어의 "뇌를 자극하는 윈도우 시스템 프로그래밍"에서 발췌하였고 단순히 개인 공부자료를 기록하고자 하는 목적으로 사용하였다. 문제의 여지가 있다면 언제든지 삭제하도록 하겠다.

 

1. CPU 구조

 

 

CPU는 ALU, 레지스터, 컨트롤 유닛, 버스 인터페이스.부분으로 나누어 볼 수 있다.

 

실제로 덧셈과 같은 연산을 수행하는 곳인 ALU로, 일종의 저장공간이 레지스터에 저장된 자료를 이용해서 작업을 수행하고 다시 레지스터에 저장하는 등의 일을 한다. 실제로 망치를 두들기고 못을 박아서 일을 하는 노동자라고 본다..

 

그리고 이 노동자 ALU에게 실제로 어떤 일을 할지 설계도면을 보고 일을 시키는 것은 컨트롤 유닛 이다. 10101000 이런식으로 되어 있는 명령어를 해석 (Decode)해서 일꾼인 ALU에게 지시를 한다.

 

다음으로는 버스 인터페이스다. CPU가 다른 부분과 정보를 주고 받을 수 있게 해주는 부분이다. 버스 인터페이스는 IO 버스와 소통을 하고 IO 버스가 키보드, 모니터, 메인 메모리 등과 소통하는 구조로 되어 있어 CPU가 여러가지 IO장치에 일일히 직접 소통하지 않아도 되는 잇점이 있다. 통신담당자가 전령과만 이야기 하고 전령이 각각 다른곳에 정보를 교환하게 해주는 것이라 생각하면 된다.

 

간단히 요약하자면, ALU-노동자, 컨트롤 유닛-설계시공자, 레지스터-작업장, 버스 인터페이스-통신담당자, IO버스-전령 이라고 할 수 있다.

 

 

'프로그래밍 > WinSysProgram' 카테고리의 다른 글

가상 메모리 (2)  (0) 2015.01.18
가상메모리 (1)  (0) 2015.01.16
16비트 CPU 명령어 설계  (0) 2014.10.25
Posted by 굿쟌
,