요즘은 OS에 대해서 심층적으로 공부를 하고 있다. 아무래도 무엇인가를 분석하려면(특히 루트킷과 같은 커널 단에서 동작하는 프로그램) OS에 대한 깊은 지식이 필요하다. 이전까지는 얼핏 들어가며 분석을 했지만 이제부터는 조금 더 효율적이고 정확하게 분석하기 위해 방학을 이용해 OS에 대한 지식을 쌓고자 앞으로 꾸준히 이렇게 글을 작성하고자 한다. 처음의 시작은 Windows이며 그 후는 Linux, Mac OS X순으로 진행할 생각이다. 해당 글들은 인터넷에서 검색하여 얻은 여러 문서들을 토대로 작성하는 것이다. 그렇기에 그 내용이 조금 빈약할수도 있고 분량이 작을 수도 있다. 추후에 전문서적을 참고하여 내용을 보충할게 있다면 더 보충할 생각이다.



자, Windows OS를 공부하기 전 Windows OS가 돌아가는 그 기반을 먼저 알아보도록 하겠다. 컴퓨터 공부에 있어 컴퓨터의 구조는 필수적이다. 역사는 선택적이라고 말할 수 있지만 역사를 모른다면 그 사람의 지적수준이 낮아 보일지도 모르기 때문에 역사도 함께 다룰 것이다.


[폰 노이만(J.von Neumann) 구조]

폰 노이만이란 것은 어떤 단어가 아닌 사람의 이름이다. 지금의 컴퓨터 모델을 제시한 수학자이다. 초창기 컴퓨터들의 사진을 보면 방 하나를 가득 메우는 엄청난 기계들과 수많은 구멍들, 전선이 보인다. 또 그 앞에 사람이 서있고 그 전선들을 여러 구멍에 꽂는 것을 심심치 않게 볼 수 있다. 이처럼 초창기 컴퓨터들은 연산을 하려 할 때 사람이 수작업으로 전선(진공관 회로)를 뽑아 다른 구멍으로 꽂는 스위칭 작업을 해야 했다. 하지만 폰 노이만은 이러한 컴퓨터의 구조를 획기적으로 개선하는 방안을 제시하였는데 그 방안은 다음 그림과 같은 구조를 가지고 있다.


[그림 1 - 폰 노이만 구조(출처 : 위키백과)]


초창기 컴퓨터들의 연산은 엔지니어들의 스위칭이었지만 폰 노이만은 이러한 작업을 프로그램화 하여 그 프로그램을 컴퓨터 내부에 저장시키는 방식을 제안한 것이다. 오늘날의 컴퓨터 구조와 동일한 것은 아니지만 그 구조는 상당히 비슷하다.

폰 노이만 구조에서 연산은 ISA(Instruction Set Architecture)를 통해 이루어진다. ISA는 연산에 필요한 명령 등을 집합적으로 부르는 단어이다. ISA의 구성 요소는 다음과 같다.



[그림 2 - ISA 구조(출처 : http://maystyle.tistory.com/84)]


 - AC(Acumulator), MQ(Multiplier Quotient, MQ는 그림상에서 존재하지 않지만 AC와 같은 역할을 하기 때문에 추가 함) : ALU로부터 계산되어지는 내용을 임시 저장하는 저장소이다.


 - MBR(Memory Buffer Register) : Main Memory로부터 읽어 들인 데이터를 저장하는 저장소이다.


 - IBR(Instruction Buffer Register) : Main Memory로부터 읽어 들인 데이터를 임시로 저장하는 레지스터이다. 즉, 언제든지 다른 데이터로 덮어씌어 질 수 있다.


 - PC(Program Counter) : 다음 실행 될 명령어가 존재하는 Memory 주소를 저장하는 저장소이다.


 - IR(Instruction Register) : 실행 될 명령어를 저장하는 레지스터이다.


 - MAR(Memory Address Register) : MBR에 저장할 데이터의 주소를 저장하는 레지스터이다.


ISA의 동작은 Fetch Cycle과 Execution Cycle로 이루어진다. Fetch Cycle은 명령을  Memory로부터 가져오는 행동이라고 생각하면 되고 Execution Cycle은 Memory로부터 가져온 명령을 실행하는 행동이라고 보면 된다.




[Intel 8086 MicroProcessor]

우리가 현재 사용하는 32bit, 64bit의 전 단계 구조라고 생각하면 된다. 현재의 컴퓨터 구조와 정말 많이 흡사하며 지금의 컴퓨터 구조와 차이점이라고 말한다면 처리하는 데이터의 크기 차이라고 말할 정도로 그 구조는 정말 흡사하다. 결국 해당 컴퓨터 구조에서 지금의 컴퓨터 구조로 발전되어 온 것이다. 해당 구조는 인텔 社에서 고안해 내었으며 8086은 16bit MicroProcessor를 뜻한다. 16bit MicroProcessor는 20bit의 Address bus가 있는데 이로 인해 Memory Access가 더 많아 졌다. 8086 구조에서는 레지스터와 포인터, 플래그를 사용해 연산을 효율적으로 수행한다. 레지스터의 종류는 어셈블리어를 다루어 본 사람이라면 쉽게 눈에 들어오는 것들이다.


 - AX : 산술과 논리 연산, I/O를 담당하는 레지스터이다.


 - BX : 간접 주소를 저장하는 레지스터이다.


 - CX : 연산의 카운터를 저장하는 레지스터이다.


 - SI, DI : 문자열 전송 및 비교 할 때 사용되는 레지스터이다.


 - BP : Stack 데이터에 접근 할 때 기준점이 되는 베이스 포인터이다.


 - SP : 현재 스택의 위치를 가리키는 스택 포인터이다.


 - CF : 연산 결과가 올림이거나 빌림일 때 1로 셋팅 되는 플래그이다.


 - IP : 다음 실행 될 Memory의 주소를 저장하는 레지스터이다.


 - ZF : 연산 결과가 0일 때 1로 셋팅되는 플래그이다.


 - PF : 연산 결과에서 하위 8bit 중 1이 짝수 개 일 때 1로 셋팅되는 플래그이다.


 - SF : 연산 결과가 음수일 때 1로 셋팅되는 플래그이다.


 - AF : 연산 결과에서 자리 올림이 발생 했다면 1로, 자리 내림이 발생 했다면 0으로 셋팅되는 플래그이다.


 - OF : 연산 결과가 표현 할 수 있는 범위를 초과하면 1로 셋팅 되는 플래그이다.


 - IF : 하드웨어로부터 오는 인터럽트를 제어하는 플래그로 1이라면 인터럽트를 수용하고 0이라면 무시한다.


 - DF : 문자열을 처리하는 과정에서 해당 플래그가 0이라면 해당 문자열의 메모리 주소를 가지고 있는 레지스터의 값을 자동적으로 증가시키고 1이라면 자동적으로 감소시킨다.


 - TF : CPU 처리에 관한 플래그로 0일 때는 일반적인 CPU는 연산 처리에 관여하게 되지만 1일 때는 명령을 실행 할 때 마다 인터럽트 처리에 관여하게 된다.


8086 Register의 경우 그 크기는 16bit밖에 되지 않는다. 그렇기 떄문에 어떤 명령을 수행 할 경우에는 그 크기를 보완하기 위해 또 다른 레지스터를 사용한다. 이러한 레지스터를 세그먼트 레지스터라고 하며 그 종류는 다음과 같다.


 - CS(Code Segment) : 수행 되어질 명령들의 위치를 나타낸다.


 - SS(Stack Segment) : Stack 위치를 나타낸다.


 - DS(Data Segment) : Data의 위치를 나타내며 Data로는 변수등이 있다.


 - ES(Extra Segment) : 문자열들의 주소를 나타낸다.




[80386 MicroProcessor]

현재 사용되고 있는 32bit 컴퓨터가 해당 구조에 해당되는 컴퓨터로 이전 8086 구조보다 다룰 수 있는 데이터가 더 많아졌으며 실수(Float)을 다루는 프로그램의 속도를 크게 향상시킨다. 또 Memory의 크기 또한 4GB를 지원하고 OS가 Memory의 자원을 효율적으로 관리 할 수 있게 MMU(Memory Management Unit) 라는 것이 추가 되었다. 8086 구조에서 사용 되는 레지스터와 포인터는  확장되어 그 크기가 32bit로 늘어났으며 부르는 용어 또한 확장의 의미로 E(Extended)가 추가되어 ESP, EBP 등으로 불린다. 플래그의 종류도 추가가 되었는데 FS와 GS라고 부르는 것이 추가 되었다. 하지만 특별히 목적이 있는 플래그는 아니다. 여분의 플래그라고 생각하면 된다. 레지스터의 종류에도 조금의 변화가 생겼다. 하지만 사용되는 목적이 기존의 레지스터와는 조금 다르다. 

시스템 레지스터라고 부르는 레지스터들인데 운영체제에 관련되어 작업을 도와주는 레지스터들이다.


 - CR(Control Register)

    1) CR0 : Paging MMU를 활성화 하고 Task를 전환/감시하며 보호 Mode 선택과 보조로 사용되는 Processor의 Emulation을 담당하는데 사용 된다.

    2) CR2 : Page Fault의 마지막 명령어 주소를 가지고 있는 레지스터이다.

    3) CR3 : Page Directory의 Base 주소를 가지고 있는 레지스터이다.


 - DR(Debug Register) : 하드웨어 브레이크 포인트를 가능케 하는 레지스터이다.


 - TR6, TR7 : Processor의 Paging 장치가 Memory의 가상 주소를 물리 주소로 변환 할 때 그 속도를 빠르게 하기 위해 사용하는 TLB Buffer의 내용을 RAM으로부터 검사하는데 사용되는 레지스터이다.


여기서 TLB가 무엇인지 짚고 넘어가자. TLB(Translation Lookaside Buffer)는 캐시(Cache)의 개념을 이용한 것이다. 어떠한 정책이나 규정에 의해 정해져 있는 개수만큼 내용을 저장해, 변환에 소요되는 시간을 줄여주는 것이다.



[80486 MicroProcessor]

80386 구조보다 조금 더 진보 된 구조로 RISC 개념을 이용해 재설계 된 구조이다. 80486 구조는 Pipe Line 구조가 적용된 구조인데, Pipe Line 구조는 자주 사용되는 명령어를 하나의 순환주기(Cycle)에 두어 수행되도록 하는 구조이다. 80486 구조는 문제 없이 데이터가 연산되게 끔 L1 Cache(크기가 8 KByte)를 CPU 내부에 추가 되었고 몇개의 플래그와 레지스터가 추가 되었다.


 - 레지스터 

    1) TR3 : Cache에 데이터를 저장하거나 Cache에 존재하는 데이터를 읽어들일 때 그 데이터(16 Byte)를 저장하는 레지스터이다.

    2) TR4 : Tag, V Bit, LRU Bit, TR3에 저장되는 데이터의 Valid Bit 레지스터이다.

    3) TR5 : Cache의 한개 Line 선택 Bit, Set 선택 Bit, 제어 Bit로 구성되어 있는 레지스터이다.


 - 플래그 

    1) CD : Cache 동작에 관한 플래그로 1로 셋팅 되면 Cache의 동작이 수행되지 않는다.

    2) NW : Cache를 통해 이루어지는 쓰기 동작을 금지 할 때 사용되는 플래그이다.



[Super Scalar]

해당 구조는 80486 구조에서 사용 되었던 Pipe Line을 두개 이상 사용하는 구조로 한번의 명령처리 주기에서 한개의 명령 밖에 처리 하지 못하던 이전 구조들과는 달리 두개 이상의 명령을 하나의 명령처리 주기에서 처리 할 수 있도록 한 구조이다. 결국 명령을 병렬처리하는 구조이다. 하지만 이 구조에는 몇가지 제약사항이 존재한다. 데이터 의존성, 자원 의존성, 프로시저 의존성이 그 제약사항인데 제약사항에 대한 설명은 다음 URL을 참고하기 바란다.


http://happyworld.egloos.com/1277581

+ Recent posts