Lecture 13: Linking
Linking Why Linkers? 링커는 분할 컴파일(Separate compilation)을 통해 생성된 오브젝트 파일들과 라이브러리를 하나의 실행 파일로 결합한다. 프로그램을 여러 개의 모듈로 나누면, 일부 모듈이 변경되었을 때 변경된 모듈만 다시 컴파일하여 링크하면 되므로 빌드 시간을 절약할 수 있다. 라이브러리의 모든 함수...
Linking Why Linkers? 링커는 분할 컴파일(Separate compilation)을 통해 생성된 오브젝트 파일들과 라이브러리를 하나의 실행 파일로 결합한다. 프로그램을 여러 개의 모듈로 나누면, 일부 모듈이 변경되었을 때 변경된 모듈만 다시 컴파일하여 링크하면 되므로 빌드 시간을 절약할 수 있다. 라이브러리의 모든 함수...
Cache Memory Organization and Operation Cache Memories CPU 칩에 내장되어 있는 캐시 메모리(Cache memory)는 지역성의 원리에 기반하여 데이터를 빠르게 제공함으로써 시스템의 성능을 향상시킨다. CPU +—————————————————————————+ | ALU ...
Storage Technologies and Trends Random-Access Memory RAM(Random-Access Memory)은 칩 형태로 패키징되어, 여러 개의 칩이 하나의 메모리를 구성한다. RAM이 데이터를 저장하는 기본 단위는 셀(Cell)이며, 각 셀은 1비트를 저장한다. RAM은 셀의 구조에 따라 S...
Generally Useful Optimizations Code Motion 루프 내에서 동일한 계산이 반복적으로 수행되는 경우, 해당 계산을 루프 외부로 이동하여 한 번만 수행되도록 최적화한다. void set_row(double *matrix, double *vector, long r, long width) { for (long c...
Memory Layout x86-64 Linux Memory Layout x86-64는 이론상 64비트까지의 주소를 가질 수 있지만, 실제로는 47비트만을 사용하므로 128TB의 메모리 공간을 나타낼 수 있다. (최대 0x7FFFFFFFFFFF) Segment Stack ...
Arrays Array Allocation 자료형이 T인 요소 L개로 이루어진 배열 A가 있다면, 해당 요소들의 전체 크기 L * sizeof(T) 바이트가 연속된 구간으로 메모리에 할당된다. Array Access 배열의 이름 A를 배열의 첫 번째 요소를 가리키는 포인터처럼 사용할 수 있다. 단, A의 값을 변경하는 것은 불가능하다. i...
Procedures 여기서는 함수, 메서드 등을 프로시저(Procedure)라고 통칭하겠다. 프로시저 호출은 제어 전달, 데이터 전달, 지역 데이터 관리와 같이 3단계로 세분화할 수 있다. 각 단계는 필요한 경우에만 수행되어, 프로시저 호출의 오버헤드를 최소화한다. Stack Structure 스택은 메모리의 한 영역으로, 호출된 프로...
Condition Codes 특정한 작업 결과에 따라 부차적으로 설정되는 플래그를 조건 코드(Condition code)라 한다. Flag Name CF Carry Flag (for unsigned) ZF Zero Fl...
x86 Architecture x86 아키텍처는 인텔이 개발한 명령어 집합 구조(Instruction Set Architecture, ISA)이다. 대표적인 CISC(Complex Instruction Set Computer) 아키텍처로, 수많은 기능과 복잡한 구조를 가진다. Intel x86 Evolution: Milestones ...
Fractional Binary Numbers 앞서 $w$ 비트 정수 $x$를 각 비트 $x_i$의 합으로 나타냈었다. [x = \sum_{i=0}^{w-1} {x_i 2^i}] 여기서 $i$를 음수 범위로 확장하면 실수에 대한 표현과 같다. [x = \sum_{i=-d}^{n-1} {x_i 2^i}] 이때 $x$는 정수부 $n$ 비트, ...