01 / ABI
Syscall / ELF
C 함수 호출이 syscall instruction과 ELF loader를 지나 커널 ABI에 닿는 구간을 정리합니다.
libc wrapper에서 syscall까지
write() 한 번이 함수 호출 규약, syscall 번호, 레지스터, 커널 진입 코드를 거쳐 파일 객체에 도달하는 과정을 확인합니다.
02./xxx 입력에서 main()과 종료까지
셸에 ./xxx를 입력했을 때 명령 해석, child 생성, execve, ELF 적재, 동적 링커, _start, main, exit_group, wait가 이어지는 전체 과정을 따라갑니다.
03errno, EINTR, 짧은 반환
오류 한 번을 재시도하는 규칙이 아니라, 작업이 얼마나 진행됐는지와 syscall restart 정책을 함께 판단하는 법을 다룹니다.
04ELF 적재와 _start
execve 이후 ELF program header, interpreter, 초기 stack, _start, __libc_start_main, main이 이어지는 순서를 봅니다.
05동적 링커, PLT/GOT, relocation
DT_NEEDED 탐색, symbol resolution, GOT 갱신, lazy binding과 symbol interposition이 시작 시간과 호출 주소를 어떻게 바꾸는지 확인합니다.
02 / PROCESS
Process
fork, execve, wait, session, service 수명처럼 프로세스가 생기고 교체되고 회수되는 순서를 다룹니다.
fork와 copy-on-write
fork가 주소 공간을 즉시 복사하지 않고 page table과 객체 참조를 복제한 뒤 write fault에서 실제 page를 나누는 과정을 다룹니다.
07execve와 process image 교체
PID를 유지한 채 주소 공간, signal disposition, credentials, fd inheritance가 새 실행 파일 기준으로 재구성되는 순서를 봅니다.
08waitpid, zombie, pidfd
child 종료 상태가 zombie로 보존되는 이유와 PID 재사용 경쟁을 pidfd가 어떻게 줄이는지 설명합니다.
09process group, session, controlling terminal
shell job control이 PID 하나가 아니라 process group에 signal을 보내고 terminal foreground group을 바꾸는 이유를 정리합니다.
10daemon보다 service supervision
double-fork 관례와 systemd 같은 supervisor 아래의 foreground service를 비교하고 signal, readiness, fd, 종료 순서를 설계합니다.
03 / FILE I/O
File Descriptor / I/O
open file description, 짧은 I/O, 경로 해석, metadata 변경, ioctl을 파일 디스크립터 수명과 함께 봅니다.
fd table, open file description, openat2
작은 정수 fd와 struct file을 구분하고, dirfd 기반 경로 해석과 openat2 resolve flag로 pathname race를 줄이는 방법을 봅니다.
12read/write 완료 loop
blocking fd에서도 한 번의 read/write가 요청 전체를 처리한다는 보장이 없는 이유와 EOF, EAGAIN, EINTR을 분리합니다.
13dup3, pipe, 표준 입출력 재배치
shell의 cmd1 | cmd2가 pipe buffer와 fd table을 어떻게 연결하는지, EOF를 위해 어느 끝을 닫아야 하는지 확인합니다.
14inode, link, unlink, atomic rename
pathname과 inode 수명을 분리하고, 열린 파일의 unlink와 임시 파일 rename을 이용한 원자적 교체·내구성 절차를 정리합니다.
15directory 순회와 getdents64
readdir가 directory entry snapshot을 제공하지 않는다는 점과 d_type, telldir cookie, 순회 중 변경을 안전하게 다루는 법을 봅니다.
16fcntl lock과 ioctl ABI
fd 제어 명령을 한데 묶어 보지 않고, advisory record lock, open-file-description lock, device-specific ioctl의 소유권과 ABI를 구분합니다.
04 / MEMORY
Virtual Memory
주소 공간, mmap, page fault, protection, allocator가 실제 page와 만나는 시점을 구분합니다.
process 주소 공간과 /proc/maps
ELF segment, heap, shared object, stack, vDSO가 VMA로 배치되고 실제 page는 fault 시점에 연결되는 과정을 구분합니다.
18mmap MAP_SHARED와 MAP_PRIVATE
같은 file page를 공유하는 mapping과 copy-on-write private mapping의 dirty/writeback 경로를 실제 두 process 예제로 비교합니다.
19mprotect, madvise, mlock
page protection, reclaim hint, resident 보장을 서로 다른 목적으로 구분하고 TLB·fault·resource limit 비용을 살펴봅니다.
20malloc, arena, brk, mmap
malloc object 수명과 kernel VMA 수명을 구분하고, free 뒤 RSS가 바로 줄지 않는 이유를 allocator cache와 fragmentation으로 설명합니다.
05 / EVENT
Signal / Event / IPC
비동기 알림을 file descriptor 기반 event loop에 모으고, 프로세스 사이에서 byte와 권한을 전달하는 방법을 다룹니다.
signal mask, pending, delivery
signal 생성, pending queue, thread 선택, mask, handler frame, sigreturn을 한 흐름으로 연결하고 handler 안전 규칙을 정리합니다.
22epoll readiness와 edge-triggered loop
readiness가 작업 완료 통지가 아니라 다음 nonblocking I/O의 진행 가능성이라는 점과 EPOLLET drain 규칙을 코드로 확인합니다.
23timerfd와 eventfd
시간 만료와 thread 간 wakeup을 8-byte counter fd로 표현해 epoll loop에 합치고, counter 누적과 overflow 규칙을 살펴봅니다.
24Unix socket과 SCM_RIGHTS
Unix domain socket이 byte뿐 아니라 열린 file 참조를 다른 process의 fd table에 설치하는 과정을 control message 단위로 설명합니다.
25POSIX shared memory와 process-shared semaphore
shm_open으로 이름을 inode-like object에 연결하고 MAP_SHARED memory 안의 semaphore로 data publish 순서를 맞춥니다.
26inotify와 directory 변경 추적
watch descriptor와 pathname 수명을 구분하고 rename cookie, queue overflow, recursive watch 누락을 복구 가능한 protocol로 다룹니다.
06 / THREAD
Thread / Synchronization
pthread 객체, mutex, condition variable, futex와 C atomic memory order를 실제 공유 데이터 기준으로 설명합니다.
pthread 생성, join, detach, TLS
pthread_t handle, kernel task, user stack, thread-local storage, joinable 종료 상태의 수명을 따로 구분합니다.
28mutex와 condition variable
predicate를 mutex로 보호하고 cond_wait의 unlock-and-sleep, spurious wakeup, lost wakeup을 bounded queue 코드로 설명합니다.
29C atomic memory order와 futex
atomic value 자체의 원자성과 주변 데이터의 가시성을 구분하고 acquire/release publish, futex sleep을 연결합니다.
07 / NETWORK
Socket
socket 생성부터 nonblocking connect, stream framing, UDP, 이름 해석까지 네트워크 프로그램의 실패 지점을 따라갑니다.
socket, bind, listen, accept 수명
listening socket과 accepted socket을 다른 kernel 객체로 보고 bind address, 두 queue, close와 half-close를 구분합니다.
31nonblocking connect와 SO_ERROR
EINPROGRESS 이후 writability가 연결 성공만을 뜻하지 않는 이유와 getsockopt(SO_ERROR)로 완료 상태를 소비하는 절차를 다룹니다.
32TCP framing과 backpressure
TCP를 message queue로 오해하지 않고 byte stream 위 length-prefix parser와 partial send queue를 만드는 방법을 설명합니다.
33UDP datagram 경계와 오류
UDP의 message boundary, truncation, connected UDP, path MTU, packet loss·duplication·reordering을 recvmsg metadata와 함께 봅니다.
34getaddrinfo와 이름 해석
DNS만이 아닌 NSS 정책, IPv4/IPv6 address list, service name, blocking resolver를 connection 시도와 분리합니다.
08 / OBSERVE
Observe / Harden
io_uring, seccomp, /proc, strace, perf로 실행 경로를 줄이고 제한하고 관찰합니다.
io_uring ring과 request 수명
SQ/CQ shared ring, submission entry, kernel request, completion entry, user buffer·fd 수명이 비동기 I/O에서 어떻게 겹치는지 봅니다.
36seccomp와 capability 경계
syscall allowlist와 privilege 분해를 같은 보안 기능으로 뭉치지 않고, no_new_privs·filter 설치·fd 선확보 순서를 설명합니다.
37/proc, strace, perf로 실행 경로 확인
source 해석을 syscall trace, process snapshot, hardware/software counter와 대조하고 관찰 도구 자체의 영향과 race를 구분합니다.