CSAPP 22

[CSAPP] 8 예외적인 제어 흐름(Exceptional Control Flow) 8.4 ~ 8.8

8.4 프로세스의 제어(Process Control)운영체제와 프로그램이 프로세스를 생성·종료·관리하는 메커니즘을 설명합니다.8.4.1 프로세스 ID 얻기각 프로세스는 고유한 PID(Process ID)를 가지며, 이를 통해 부모·자식 관계를 파악하거나 프로세스 제어를 수행할 수 있습니다.getpid() : 호출 프로세스의 PID를 반환하며, 항상 성공합니다. getppid(): 부모 프로세스의 PID를 반환하며, 부모가 이미 종료된 경우에는 1(init)의 PID를 반환합니다.#include #include int main() { printf("PID = %d\n", getpid()); // 호출 프로세스의 PID 반환 :contentReference[oaicite:0]{index=0} p..

CSAPP/8장 2025.04.21

[CSAPP] 8 예외적인 제어 흐름(Exceptional Control Flow) 8.1 ~ 8.3

이번 포스팅에서는 예외적인 제어 흐름(ECF, Exceptional Control Flow)에 대해 다룹니다. 이를 이해하기 위해 먼저 일반적인 제어 흐름에 대해 간단히 알아보겠습니다.일반적인 제어 흐름컴퓨터 프로그램은 보통 메모리에 연속적으로 저장된 명령어들을 순차적으로 실행합니다. 이러한 흐름은 다음과 같은 방식으로 이루어집니다:순차 실행: 명령어들이 메모리에 저장된 순서대로 실행됩니다.분기 및 반복: 조건문과 반복문을 통해 특정 조건에 따라 흐름이 변경됩니다.함수 호출과 반환: 함수를 호출하면 해당 함수의 명령어들이 실행되고, 완료되면 원래 위치로 돌아옵니다.하지만, 프로그램 실행 중 예기치 않은 상황이나 외부 이벤트로 인해 이러한 흐름이 갑자기 변경되는 경우가 있습니다. 이를 예외적인 제어 흐름(..

CSAPP/8장 2025.04.19

[CSAPP] 7 링킹(Linking) - 7.8 ~ 7.15

7.8 실행 가능한 목적 파일(Executable Object Files)링커의 마무리 작업 : 실행 파일 만들기앞서 우리는 여러 개의 목적 파일(.o)을 링커가 하나의 실행 파일로 합치는 과정을 살펴봤습니다. 이 과정을 비유하자면, 각각의 목적 파일이 '부품'이라면, 링커는 이 부품을 조립하여 하나의 완성된 로봇을 만드는 작업자라고 할 수 있습니다.이렇게 완성된 실행 파일은 단순한 텍스트가 아니라, 운영체제가 메모리에 올려서 직접 실행할 수 있는 바이너리 파일이 됩니다. 리눅스에서는 이를 ELF (Executable and Linkable Format) 파일이라 부릅니다.ELF 파일 구조ELF 실행 파일은 아래와 같은 주요 요소들로 구성되어 있습니다.ELF 헤더파일의 시작 지점에 위치이 파일이 어떤 아..

CSAPP/7장 2025.04.18

[CSAPP] 7 링킹(Linking) - 7.1 ~ 7.7

링킹(Linking)이란 여러 개의 오브젝트(코드, 데이터) 조각들을 모아 "메모리에 복사해 즉시 실행 가능한 하나의 파일"로 만드는 과정입니다. 언제 일어나는가?Compile time: 컴파일러 드라이버가 ld 등을 호출할 때Load time: OS loader가 실행 파일을 메모리에 매핑할 때Run time: 애플리케이션이 dlopen() 등으로 공유 라이브러리를 불러올 때이 과정을 통해 분할 컴파일(separate compilation) 이 가능해집니다. 모듈 하나만 수정해도 전체를 다시 빌드할 필요 없이 해당 모듈만 재컴파일 → 재링크하면 되죠.Linking을 배워야 하는 이유대규모 소프트웨어 개발 지원모듈·라이브러리 간 버전 불일치, 누락된 객체로 인한 링커 에러 해결에 필수“왜 이 심볼을 못 ..

CSAPP/7장 2025.04.17

[CSAPP] 3-8 배열의 할당과 접근

컴퓨터 시스템에서 배열은 단순히 여러 데이터를 나열하는 자료구조를 넘어, 메모리 할당과 주소 계산의 기본 원리를 보여줍니다. 이번 포스팅에서는 C 언어에서 배열이 메모리에 어떻게 배치되고 접근되는지, 포인터 산술과 어셈블리 수준의 주소 계산까지 상세히 분석합니다.1. 배열의 기본 원리1.1. 연속적 메모리 할당 C 언어에서 배열 선언은 연속된 메모리 블록을 할당받습니다.T A[N];선언 시, 배열의 시작 주소를 xA라 하고 요소의 크기를 L이라 하면, 각 요소는 다음 주소에 저장됩니다.A[0]: xAA[1]: xA + LA[2]: xA + 2L…A[i]: xA + L * i이와 같이, *A[i] ≡ (A + i)라는 표현은 “기준 주소 + i×요소 크기”를 역참조하여 값을 얻는 방식임을 보여줍니다.1.2..

CSAPP/3장 2025.04.15

[CSAPP] 3-7 프로시저

컴퓨터 프로그램은 여러 작업을 하나의 함수(프로시저)로 묶어 필요할 때마다 호출합니다.하지만 단순히 함수를 호출하는 것만이 아니라, 함수가 호출될 때마다 스택 프레임(활성화 레코드)이 생성되어 함수의 인자, 반환 주소, 지역 변수 등이 저장되고, 함수 실행이 끝나면 원래의 상태로 복귀하게 됩니다.이 글에서는 C와 어셈블리어 예시를 통해 프로시저 호출의 내부 동작, 스택 프레임 구성, 그리고 함수 호출과 반환 과정에 대해 자세히 알아보겠습니다. 또한, 프로시저라는 개념이 추상화(abstraction)의 한 형태임을 이해하기 위해, 추상화의 개념과 수학적 함수로서의 관점을 함께 살펴보겠습니다.1. 추상화와 프로시저추상화 추상화는 복잡한 시스템을 간단하게 만들어, 사용자가 필요한 핵심 기능만을 이용할 수 있도..

CSAPP/3장 2025.04.09

[CSAPP] 3-6 제어문

컴퓨터 프로그램은 단순히 순차적으로 명령어를 실행하는 것이 아닙니다.우리가 if, for, while 같은 제어문으로 “만약 ~라면”, “반복하라”, “갈림길에서 어느 쪽으로 갈지”를 표현하듯이,실제 기계어(어셈블리어)에서는 이러한 제어 구조를 비교 명령어, 조건부 점프, 무조건 점프와 함께작은 플래그(조건 코드)를 이용해 제어합니다.먼저, 조건문이나 반복문을 제대로 이해하려면 '조건 플래그'가 무엇인지 알아야 합니다.조건 플래그는 계산 결과에 대해 “이 값이 0인가?”, “음수인가?”, “넘쳤나?”와 같은 정보를1비트짜리 스위치처럼 저장해 놓은 것으로, 이후에 조건부 점프 명령어가 이 플래그들을 참고하여프로그램의 흐름을 결정하게 됩니다.1. 조건 플래그(Condition Codes) - 결과를 판단하는..

CSAPP/3장 2025.04.09

[CSAPP] 3-5 산술연산과 논리연산

1. 산술 및 논리 연산의 개요컴퓨터는 기본적으로 데이터를 처리하기 위해 다양한 연산을 수행합니다. 이러한 연산은 크게 산술 연산과 논리 연산으로 구분할 수 있습니다. 산술 연산 : 덧셈, 뺄셈, 곱셈, 나눗셈과 같은 수학적 계산을 수행합니다. 논리 연산 : AND, OR, NOT과 같이 비트 단위의 논리적 판단을 수행합니다.이러한 연산들은 컴퓨터 내부에서 어셈블리어 명령어로 표현되며, 각 명령어는 특정한 기능을 수행합니다. 2. 유효 주소 적재(Load Effective Address)LEA(Load Effective Address) 명령어는 메모리 주소를 계산하여 그 결과를 레지스터에 저장합니다. 즉, 실제 메모리에서 데이터를 읽어오는 것이 아니라, "주소 계산" 결과를 얻어내는 역할을 합니다.e.g..

CSAPP/3장 2025.04.08

[CSAPP] 3-4 정보 접근하기

1. 서론컴퓨터는 데이터를 메모리에 저장하고 필요할 때 꺼내 사용합니다. 마치 사람으로 비유하면 우리가 책상 서랍에 물건을 보관하고 필요할 때 꺼내 쓰는 것처럼 말이죠. 이번 글에서는 데이터를 어떻게 저장하고 불러오는지, 특히 오퍼랜드 식별자, 데이터 이동 명령어, 스택 데이터의 저장과 추출에 대해서 알아보겠습니다. 본론으로 넘어가기 전에, 먼저 레지스터의 종류를 잠깐 살펴보겠습니다레지스터(Register)란? 레지스터는 CPU 내부에 있는 아주 빠른 저장소로, 연산이나 데이터 처리를 위해 가장 자주 사용되는 공간입니다. 아래 그림은 x86-64 아키텍처에서 사용하는 대표적인 레지스터들을 정리한 표입니다.%rax : 계산 결과(리턴 값)를 저장 %rdi, %rsi, %rdx, %rcx, %r8, %r9 ..

CSAPP/3장 2025.04.08