시그널
·
CS:APP
시그널(Signal)이란?시그널(Signal)은 프로세스에게 특정 사건이 시스템 내에서 발생했음을 알리는 작은 메시지. 시그널은 운영체제(OS)가 프로세스의 흐름을 예외적으로 중단하고, 특정 처리를 수행하도록 요청하는 방식입니다.시그널의 필요성외부에서 프로세스 강제 종료 요청프로세스 간 통신 및 동기화비정상적 사건 알림 (메모리 접근 위반 등)시그널의 종류 및 대표적 예시리눅스는 약 30여가지의 시그널을 지원, 대표적인 예시:시그널기본 동작설명SIGINT (2)종료키보드 인터럽트 (Ctrl+C)SIGKILL (9)종료강제 종료 (무조건 종료)SIGSEGV (11)종료 및 코어덤프잘못된 메모리 접근SIGALRM (14)종료타이머 알람SIGTERM (15)종료소프트웨어 종료 요청SIGCHLD (17)무시자식..
예외상황
·
CS:APP
예외(Exception)란?예외는 프로그램이 정상적으로 진행되던 도중, 특정 상황이 발생했을 때 운영체제(OS)가 프로그램 흐름을 강제로 바꾸는 사건. 이를 예외적 제어 흐름(Exceptional Control Flow)필요성:외부 장치 입력 (키보드 입력, 마우스 클릭, 네트워크 데이터 수신 등)프로그램의 예기치 않은 오류 (0으로 나누기, 메모리 접근 오류 등)OS의 서비스 요청(시스템 콜)정상적 함수 호출(call) 방식으로 대응 불가능하기 때문에 운영체제의 특수한 처리(예외 처리, Exception Handling)가 필요예외 처리 구조 (Exception Handling)예외 처리는 다음과 같은 방식으로 진행예외 발생 시 CPU가 이를 감지하고 `예외 번호를 찾음` (그림 1)CPU가 미리 설정..
실행 가능 목적파일의 로딩
·
CS:APP
1. 실행 파일 로딩이란?정의: 디스크에 저장된 실행 파일을 메모리에 복사하고, 그 프로그램의 첫 명령어로 점프(jump)하여 실행하는 과정.시작 방식: 리눅스 쉘에서 ./prog처럼 실행하면 loader가 호출되어 시작됨.2. 누가 실행하는가?loader (로더): 운영체제 안에 항상 상주하는 커널 코드.프로그램을 실행할 때 execve() 시스템 호출을 통해 로더가 프로그램을 메모리에 올림.3. 로더의 역할ELF 실행 파일을 열고, 내부의 program header table을 분석..text, .data, .rodata, .bss 등 각 섹션을 지정된 런타임 주소에 복사..bss는 0으로 초기화.entry point(첫 명령어 위치)로 점프하여 실행 시작.런타임 메모리 구조 (Figure 7.15 ..
ELF, Executable and Linkable Format (재배치 가능 목적파일)
·
CS:APP
ELF란?ELF (Executable and Linkable Format)리눅스에서 사용되는 실행 파일, 목적 파일 (.o), 공유 라이브러리 (.so)의 표준 포맷목적: 프로그램을 효율적으로 연결(link), 실행(load) 하도록 정보 구조화사용처: 링커(ld), 로더(execve), 디버거(gdb)구체적 설명오브젝트 파일은 “반쪽짜리 실행파일”주소가 확정되지 않았기 때문에 재배치가 가능하고, 링크 과정을 통해 최종 주소가 정해짐.구조ELF HeaderELF 파일임을 알리는 시작 지점파일 전체의 구조를 정의어떤 CPU용인지, 32비트/64비트인지, 실행파일인지 목적파일인지 등을 기록| **섹션** | **설명** || --- | --- || .text | **기계어 코드**가 들어가는 곳 (함수 본체..
컴파일러 드라이버
·
CS:APP
gcc와 같은 컴파일러 드라이버는 단순히 컴파일만 하는 게 아니라, 여러 단계를 자동으로 실행해주는 “드라이버(driver)” 역할을 한다.gcc는 다음 단계를 순서대로 수행한다*gcc -Og -o main main.c sum.c*# 또는 (main.c만 컴파일 시)*gcc main.c -o main*전처리기 (cpp)#include 같은 헤더 포함#define, #ifdef 등 전처리 지시어(매크로) 처리결과: .i 파일 (순수 C 코드)똑같은 C 코드지만, 모든 include가 펼쳐진 상태// 예시 출력int main() {printf("Hello, world\n");} gcc -E main.c -o main.i컴파일러 (cc1).i → .s : 어셈블리 코드로 변환결과: .s 파일 (x86-64 ..
함수는 추상화의 결과다 - CS:APP 3.7 프로시저 호출
·
CS:APP
프로시저 호출은 사람에게 익숙한 여러 모습 ‘함수, 메서드, 서브루틴, 핸들러 등’으로 추상화되어 구현되지만, 기계어 수준에서는 처리해야 할 여러 과정이 있다.예를 들어 프로시저 P가 프로시저 Q를 호출하고, Q가 실행한 후 다시 P로 리턴을 예로제어권 전달 (Passing Control) : 프로그램 흐름이 바뀌는 순간호출한 P는 call Q를 실행CPU는 현재 위치 바로 다음 주소를 리턴 주소(return address)로 스택에 pushQ의 첫 번째 명령어 주소로 점프[Q 종료 후]ret 명령어가 스택에서 return address를 꺼내고 점프다시 P로 복귀즉, call / ret는 Jump를 수행하지만, 실제로는 리턴 주소를 저장하고 복구 하는 기능을 수행데이터 전달 (Passing Data) ..
스택은 사실 아래로 자란다(push,pop) - CS:APP 3.4.4
·
CS:APP
후입선출(LIFO: Last-In, First-Out) 자료 구조x86-64 아키텍처에선 주소가 높은 곳에서 낮은 곳으로 자람스택의 꼭대기는 항상 %rsp 레지스터가 가리킴%rsp는 push할 때 내려가고, pop할 때 올라감명령어 요약명령어동작 설명pushq S%rsp -= 8, M[%rsp] = Spopq DD = M[%rsp], %rsp += 8- q는 quad-word, 즉 8바이트- 모든 연산은 8바이트 정렬을 따름📍 pushq %rax 실행 전%rsp = 0x108[0x108] ↑ (아직 안 쓴 공간)📍 pushq %rax 실행 후%rsp = 0x100[0x100] = %rax의 값📍 popq %rbx 실행 후%rsp = 0x108[0x100] = (0x123 등, 값은 여전히 남아 있..
[C, Assembly] movq 예제
·
CS:APP
movq 학습내용은 아래에 mov 인스트럭션 - CS:APP 3.4.2메모리 ↔ 레지스터 ↔ 즉시값(상수) 간 데이터를 복사하는 명령어모든 조작의 기본 단위기본 형태mov[b|w|l|q] S, D ; D S : Source operand (어디서 가져올지)D : Destination operand (어디다 저장할지)가능한ahpicl.tistory.com long exchange(long *xp, long y){ long x = *xp; *xp = y; return x;}포인터 xp가 가리키는 값을 읽어서 x에 저장그 메모리 위치에 y를 다시 씀원래 있던 값 (x)를 반환어셈블리 코드exchange: movq (%rdi), %rax ; x = *xp → xp는 %rdi에 있..
mov 인스트럭션 - CS:APP 3.4.2
·
CS:APP
메모리 ↔ 레지스터 ↔ 즉시값(상수) 간 데이터를 복사하는 명령어모든 조작의 기본 단위기본 형태mov[b|w|l|q] S, D ; D S : Source operand (어디서 가져올지)D : Destination operand (어디다 저장할지)가능한 조합S → D허용 여부예시의미Immediate → Register✅movl $0x10, %eax%eax(32bit)에 0x10을 넣음Immediate → Memory✅movb $-1, (%esp)메모리 주소(%esp)에 1byte(4bit) -1을 저장Register → Register✅movq %rax, %rbx%rax값을 %rbx에 복사 8bytes(64bit)Register → Memory✅movq %rax, -12(%rbp)%rax값을 메모리 주소..
오퍼랜드 식별자(operand specifier 어셈블리의 시작과 끝 - CS:APP 3.4.1
·
CS:APP
오퍼랜드 식별자란?어셈블리에서 “이 데이터 어디서 가져올거야?”를 명시하는 방식즉, 값의 출처(location of data) 를 어떻게 지정하느냐임오퍼랜드의 종류구분예시해석핵심 특징Immediate$0x10상수 16값 그 자체Register%rax레지스터 rax에 저장된 값가장 빠름, 가장 흔함Memory8(%rbp)rbp+8 위치의 메모리 값간접 참조, 주소 계산 포함Immediate(즉시값) 타입 ($value)movq $5, %rax ; rax에 5 저장$5 : 숫자 그 자체앞에 $는 “뒤에 오는 것이 주소가 아닌 값” 이라는 선언C로 따지면 x = 5; 같은 느낌movq $0x10, %rax ;rax에 0x10을 저장메모리에서 가져오는게 아닌, 명령어 내부에서 즉시 가져옴CPU는 값을 해석할 필..