안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

컴퓨터 구조 (Architecture)/CSAPP (21)

[CSAPP] Sequential Implementation

동일한 ISA를 탑재하는 CPU라고 할지라도 내부 구현 방식은 다양할 수 있다. 특히 '명령어를 해석하고 실행하는 방식'의 관점에서 구현 방식을 나눠보면, Sequential Implementation(이하 SEQ)과 Pipelined Implementation(이하 파이프라인)이 대표적이다. SEQ가 가장 단순하지만 정확한 구현 방식이라면, 파이프라인은 성능의 개선을 위해 새롭게 고안된 구현 방식이라고 할 수 있다. 우리는 앞서 x86-64의 단순한 버전으로서 공부한 Y86-64를 기준으로, SEQ와 파이프라인이 구체적으로 어떻게 구현되는 것인지 알아볼 것이다. 이번 포스팅에서는 먼저 SEQ 방식에 대해 알아보도록 하자. 1. SEQ Overview 1-1. 프로세스 상태 (Process State) ..

[CSAPP] Y86-64 - Logic Design

1. 데이터의 표현 : 비트의 세계로 컴퓨터는 내부적으로 모든 데이터를 0과 1로 처리한다. 이것이 구체적으로 무슨 말일까? 사실 전압이라는 것은 이산적인 값이 아니라 연속적인 값이다. 그래서 전압 값의 범위를 크게 세 범위로 나누게 된다. 하나는 0에 해당하는 영역, 다른 하나는 1에 해당하는 영역, 마지막 하나는 나머지 두 영역 사이에 존재하는 보호 범위(Guard Range)이다. 결국, 보호 범위에 해당하지 않는 전압을 가하면 이는 반드시 0 또는 1로 해석이 된다. 이러한 원리로 신호에 가해지는 작은 노이즈들은 데이터의 표현에 거의 영향을 주지 않게 되며, CPU 내부 회로를 더욱 단순하게 디자인할 수 있게 된다. 결국 컴퓨터의 데이터를 다루는 것에 있어서 연산을 수행한다는 것은 곧 0과 1로 ..

[CSAPP] Y86-64 - Basics

1. Y86-64 x86-64에 대해 알아보았으니, 이제는 그러한 ISA를 탑재하는 CPU의 구현 방식을 살펴볼 때이다. 동일한 ISA를 탑재한다고 하더라도, CPU가 명령어를 해석하고 실행하는 방식의 구현은 여러 가지가 될 수 있기 때문이다. 그중에서도 우리가 알아볼 구현 방식은 바로 Sequential Implementation과 Pipelined Implementation이다. 하지만 앞서 배운 x86-64를 기준으로 CPU의 명령어 실행 구현 방식을 알아보는 것은 상당히 까다롭다. x86-64는 대중의 인기를 얻기 위해 셀 수 없이 많은 최적화를 시도하였고 그로 인해 내부 구현도 이해하기 어려운 수준으로 복잡해져 있기 때문이다. 그래서 우리는 x86-64를 단순화한 버전인 Y86-64라는 ISA를..

[CSAPP] x86-64 - Miscellaneous Topics

1. 메모리 레이아웃 1-1. x86-64 메모리 레이아웃 (Memory Layout) 메모리 레이아웃(Memory Layout)이란 프로그램이 실행될 때 해당 프로그램의 데이터와 코드가 어느 곳에 어떻게 할당되는지를 나타내는 도식이다. 엄밀하게는 프로그램의 데이터와 코드가 로드되는 가상 주소 공간(Virtual Address Space)의 구조를 나타낸다. 물론 이는 시스템마다 다르다. 예를 들어 x86-64에서 컴파일되는 프로그램을 실행하면 해당 프로그램의 데이터와 코드가 오른쪽 그림과 같이 가상 주소 공간에 로드된다. 1-1-1. 스택 (Stack) 다른 말로 런타임 스택이라고도 하며, 8MB의 공간 제한이 있다. 지역 변수 등의 함수 내 지역 데이터가 저장되는 영역이다. 1-1-2. 힙 (Heap..

[CSAPP] x86-64 - Data

1. C 언어 배열 1-1. 배열 할당 및 접근 (Array Allocation and Access) T A[L]; 자료형이 T인 데이터 L개로 이뤄진 배열 A를 선언하는 문장이다. 배열의 할당은 어셈블리어 수준에서 메모리에 L x sizeof(T) 바이트를 연속적으로 할당함으로써 구현된다. 그리고 배열 요소의 접근은 어셈블리어 수준에서 배열의 첫 번째 요소를 가리키는 포인터인 A에 특정 인덱스 값을 더한 주소에 접근하는 방식으로 구현된다. A는 배열의 첫 번째 요소를 가리키는 자료형이 T*인 포인터이다. 1-2. 예시 (Example) 다음 예시를 참고하여 배열의 할당, 요소의 접근이 어셈블리어 수준에서 어떻게 구현되는지 이해해 보자. 1-3. 다차원 배열 (Multi-dimensional (Neste..

[CSAPP] x86-64 - Procedures

1. 스택 (Stack) 1-1. x86-64 스택 스택(Stack)은 Stack Discipline에 의해 관리되는 메모리 영역을 말한다. Stack Discipline이란 스택을 관리하기 위한 일종의 규율과 같은 것이다. 예를 들어, x86-64에서는 %rsp 레지스터가 현재 스택의 가장 낮은 주소(Top의 주소)를 저장하기로 되어 있다. 또한 스택에 데이터가 쌓일 때는 낮은 주소 방향으로 쌓이도록 약속이 되어 있다. 따라서 데이터를 Push 할 때는 %rsp의 값을 8만큼 감소시켜야 하고, 데이터를 Pop 할 때는 %rsp의 값을 8만큼 증가시켜야 할 것이다. 1-2. x86-64 스택 Push & Pop 명령어 x86-64에서는 스택에 데이터를 쌓기 위한 Push 명령어와 스택에서 데이터를 꺼내기..

[CSAPP] x86-64 - Control

1. 컨디션 코드 1-1. 프로세서 상태 (x86-64) x86-64 프로세서의 상태, 즉 현재 실행 중인 프로그램에 대한 정보들로는 무엇이 있을까? 가장 먼저 여러 임시 데이터들을 저장하는 %rax와 같은 범용 레지스터들과, 현재 런타임 스택의 스택 포인터를 저장하는 %rsp 레지스터가 있다. 그리고 다음 실행할 명령어의 메모리 주소를 저장함으로써 현재의 제어 위치를 나타내는 %rip 레지스터(PC 레지스터)도 이에 해당한다. 또한 조건 분기/이동에 사용되는 상태 값을 저장하는 컨디션 코드(Condition Code) 레지스터들도 있다. 1-2. 컨디션 코드 (Condition Code) x86-64의 컨디션 코드 레지스터는 총 4개이다. 첫째, 부호 없는 값의 Carry Out 발생 여부를 나타내는 ..

[CSAPP] x86-64 - Basics

1. 인텔의 역사 (CPU, ISA) 1-1. 인텔 x86 CPU 인텔의 CPU는 현재까지도 노트북, 데스크탑, 서버의 시장을 지배하고 있을 만큼 많은 곳에서 사용이 된다. 인텔 CPU의 중요한 특징 중 하나는 바로 하위 호환성(Backward Compatibility)이다. 즉 과거에 출시된 CPU에 맞춰서 개발된 소프트웨어들도 여전히 정상적으로 실행될 수 있게끔 기존 인터페이스를 유지하면서, 새로운 기능을 조금씩 추가하는 것이다. 인텔의 CPU는 무려 1978년에 출시된 8086 CPU까지도 지원할 수 있도록 하위 호환성을 지켜오고 있다. 참고로 x86이란 8086 CPU를 포함하여 그 이후 출시된 인텔의 CPU와 ISA들을 통틀어서 부르는 말이다. 따라서 현재 사용되는 인텔의 CPU와 ISA도 x8..

[CSAPP] Virtualization

1. 운영체제 (Operating System, OS) 1-1. 부팅 (Booting) 컴퓨터 전원을 켜면 어떠한 과정을 거쳐서 운영체제의 실행으로까지 이어지는 것일까? 컴퓨터의 전원을 켜는 순간, 실행할 명령어의 주소를 담고 있는 PC 레지스터의 값은 특정 값으로 초기화된다. 그 값은 ISA에서 정의하는 것으로, OS를 실행하기 전에 수행해야 하는 몇몇 초기화 작업들을 위한 루틴의 시작 주소가 된다. 그러한 루틴은 ROM 혹은 NOR 플래시 메모리와 같은 비휘발성 메모리에 저장되어 있어서, 컴퓨터의 전원이 꺼져 있을 때도 데이터가 계속 유지된다. 초기화 작업을 위한 루틴이 종료되면, 이제 하드 디스크에서 OS의 코드를 로드하여 실행한다. 이로써 부팅이 완료되는 것이다. 1-2. 운영체제의 역할 OS는 ..

[CSAPP] Overview

1. Instruction Set Architecture (ISA) 1-1. 인터페이스 (Interface) 인터페이스의 사전적 정의는 '독립적이면서 때로는 서로 관련이 없는 두 시스템이 접촉하여 서로 통신을 하는 지점'이다. 예를 들어 인간이라는 시스템과 자동차라는 시스템 두 개를 생각해 보자. 두 시스템은 당연히 서로 관련이 없고 독립적이다. 그러나 인간이 자동차를 운전하려고 할 때, 두 시스템은 접촉하게 된다. 이때 인간이라는 시스템이 자동차라는 시스템을 원하는 방식대로 조작하기 위해서는 핸들, 브레이크, 엑셀 등과 같이 두 시스템 간의 인터페이스가 필요하다. 여기서 중요한 점은, 인간은 자동차의 내부 구현까지 알 필요가 없다는 것이다. 예를 들어 핸들을 오른쪽으로 돌리면 자동차가 오른쪽으로 간다는..