CSAPP Wiki

학습 기록 · 2026-10-25

Ch8 검증 보고서

확인 기준일: 2026-10-25 KST. 아래는 각 수정 시점에 실제 실행한 검증 기록이다.

원본 확인

GitHub origin/main에서 이전 보고의 9dc088ecb019ad79dd246b06d159c26d1d80f290과 Ch8 HTML·Markdown·6개 SVG를 확인했다. 로컬을 fast-forward하고 기존 프롬프트 변경을 보존했다. 라이브 /csapp/는 HTTP 200으로 응답했다. 초기 배포본의 파일 날짜는 2026-07-26이었다. Pi는 Tailscale SSH 추가 인증 후 연결됐다. Dokku 0.38.20, app csapp, deploy branch main을 확인했다.

개선한 내용

주요 주장과 근거

주장 판정 근거와 조건
Ch8가 GitHub main에 존재 확인 origin/main 9dc088e와 실제 파일 확인
당시 DNS 오류로 현재도 배포 불가 현재 상태 갱신 이번 요청에서 공개 HTTPS 200. Tailscale 추가 인증 후 SSH 연결
3판 교재 범위·쪽수 확인 공식 preface3e.pdf p.xiv. §8.1 p.723~§8.2.4 p.734
Interrupt/trap/fault/abort 조건부 일치 CSAPP 그림·CMU 자료, Intel 093 Vol.3 §7.5~7.6. 용어 범위 구분
#DE 조건 확인 Intel 093 Event 0, divisor 0 또는 quotient overflow
x86-64 syscall arg4=r10 확인 syscall(2) Architecture calling conventions
C ABI arg4=rcx 확인 AMD64 psABI e1ce098의 low-level-sys-info.tex, INTEGER 인자 배치
exit_group 비복귀 확인 exit_group(2) DESCRIPTION·RETURN VALUE
maps의 r/w/x/s/p 확인 proc_pid_maps(5), man-pages 6.19
PFN 0의 해석 조건부 kernel pagemap, Linux 4.2+ CAP_SYS_ADMIN 제한. 물리 주소 확정 불가
Go G/M/P·P 회수 확인 go1.26.0 HACKING.md, proc.go의 entersyscallblock·retake·netpoll
긴 NIF·dirty 분류 확인 OTP 29.1.2 erl_nif의 Long-running NIFs·Dirty NIFs
power-off의 정리·권한 보완 reboot(2) CAP_SYS_BOOT·sync·플랫폼 조건. 실제 전원 제어 미실행

출처 HTTP 검사. Intel 안내 페이지는 web 도구로 열람됐으나 직접 HTTP 검사에서는 403이었다. 공식 PDF는 직접 HTTP 200으로 내려받아 revision 093, September 2026과 관련 절을 확인했다. 레포 README의 교재 PDF 주소는 이번 환경에서 PDF 본문을 반환하지 않았다. 교재 범위는 공식 목차·정오표·공식 그림과 CMU 교재 동반 자료로 대조했다. 강의 녹취 원본은 대조하지 않았으며 추정 발언을 추가하지 않았다.

LAB 실행

실행일: 2026-10-25 KST. macOS ARM64 host의 OrbStack Linux, Debian bookworm-slim, GCC 12.2.0, strace 6.1. Kernel: 7.2.12-orbstack-00394-gbecdd6130068.

검사 ARM64 native x86-64 에뮬레이션
-Wall -Wextra -Werror 컴파일 PASS PASS
hello·flows·maps 실행 PASS PASS
write 13바이트·exit_group trace PASS syscall trace 불완전
부모·자식 각 3줄 PASS PASS
rw-p mapping·pagemap 읽기 PASS, present=1 PFN=0 mapping introspection 미실행

x86-64 에뮬레이션에서 strace가 x32/64 mode 전환 메시지를 반복하며 필터된 syscall을 표시하지 않았다. 전체 LAB의 trace 검사는 실패로 취급했다. ARM64의 관측을 x86-64 syscall register 관측으로 보고하지 않았다. 전원 종료·host 재부팅은 실행하지 않았다.

구조·문체·회귀 검사

로컬 브라우저 검증

설치된 Google Chrome을 Playwright로 headless 실행했다. 320×568, 375×812, 812×375, 390×844, 430×932, 768×1024, 1024×768, 1440×900의 light theme, 375×812·1440×900의 dark theme를 검증했다.

측정 결과
페이지 scrollWidth-clientWidth 모든 조건 0px. 허용 오차 1px
ellipsis CSS 적용 요소 모든 조건 0
실제 truncateCount 모든 조건 0
실제 scrollY 이동 모든 조건 700px
anchor 이동·대상 정상, 깨진 anchor 0
SVG 모두 7개 로딩·XML·aria-label 확인
375px의 SVG 렌더 폭 317px, viewBox 360 대비 축소. 최소 19단위 라벨은 약 16.7 CSS px
iframe 0개. 최상위 문서에서 측정
브라우저 오류·실패 요청 최종 검사 0

초기 favicon 404를 inline favicon으로 수정했다. 화면 검토에서 중복 제목을 발견해 renderer의 선행 공백 처리를 수정하고 다시 렌더링했다. 본문 표의 내부 가로 스크롤은 허용하고 페이지 넘침과 구분했다. 전체 결과와 도판 스크린샷은 local metrics에 있다. 모바일 상단, 모바일 가로, 실행 타임라인, dark Go 도판을 직접 확인했다.

Git과 배포

문서 payload 커밋 a6e1812를 GitHub main에 push하고 기존 Dokku remote로 배포했다. Dokku build mvnl9imxumykhi는 succeeded, exit code 0으로 종료했다. 새 container fb798948f14b의 실행과 기본 uptime·port healthcheck 통과를 확인했다. 정적 사이트의 release는 이 build ID·image·container로 식별한다. 별도 releases:list 명령은 이 Dokku 설치에 없다.

/csapp/ 경로를 유지했고 기존 Ch6·Ch7도 원본 해시와 일치했다. 배포 진행 중 이전 container가 응답한 짧은 구간에는 Ch8 404를 관측했다. proxy 전환 후 재검사에서 12개 대상이 모두 정상 응답했다. 검사 후 서버 로그 30줄에서 error·crit·emerg는 없었다. 시작 로그의 기존 charset_types 중복 text/html 경고는 설정에서 중복 항목을 제거했고, 동일 nginx image의 임시 container에서 nginx -t 성공을 확인했다. 이 설정과 라이브 검증 증거는 후속 커밋·동기화 배포에 포함한다.

이 보고서의 배포 기록은 위 payload를 직접 검증한 결과다. 후속 보고서·증거 커밋의 SHA와 최종 배포 결과는 Git 이력 및 Dokku build 이력에서 확인한다.

배포 전 app은 csapp, Dokku 0.38.20, branch main, container e1970ef60d3였다. 서버 bare repo의 main은 93a22e8b0187b0b0a632412685744d7a1da7e8c0였다. 기존 pre-receive hook이 dokku git-hook csapp을 호출하는 것을 확인했다.

남은 범위

x86-64 추가 검증

판단 과정과 재현 방법은 Ch8 본문의 실습 디버깅 사례에 정리했다. 통합 전 별도 렌더링의 측정 기록은 초기 측정·스크린샷에 보존했다. 최신 본문 통합 검증은 아래 기록을 따른다.

사용자 지적 후 orb의 기존 ubuntu amd64 환경을 확인했다. Ubuntu 25.04에 GCC 14.2.0·strace 6.14를 설치하고 orb -m ubuntu sh examples/0002-exceptional-control-flow/verify.sh를 실행했다. hello, world 출력은 성공했지만 syscall trace가 비어 전체 LAB은 exit 1이었다. 별도 strace /bin/echo hello에서도 x32/64 mode 전환이 반복되고 write·exit_group이 표시되지 않았다. Orb 실행 기록.

이어 설치된 QEMU로 x86-64 커널과 userspace를 함께 실행했다. Orb의 전역 Rosetta 설정은 변경하지 않았다.

항목 실제 관측
QEMU 11.1.2, TCG full-system, q35·CPU max
Kernel Linux 6.18.58-0-lts x86_64
Userspace Debian bookworm, GCC 12.2.0, strace 6.1
자원 virtual CPU 2개·RAM 1536 MiB·network 없음
write fd=1, 요청 13바이트, 반환 13
exit_group status=0, 비복귀 trace
흐름 부모·자식 각 3줄·순서 0→1→2
mapping private anonymous rw-p
pagemap present=1, PFN=255844. 해당 guest root 권한에서 관측한 값
전체 결과 CSAPP_QEMU_EXIT=0, PASS

LAB이 끝나면 QEMU guest process와 임시 rootfs를 정리한다. host 재부팅·전원 종료는 수행하지 않는다. 이 결과로 기존 x86-64 syscall LAB의 미검증 상태를 해소했다.

Ch8 본문 통합 검증

디버깅 사례의 관측·가설·실험·선택 근거·한계·재현 절차를 Ch8의 LAB 내부 하위 절에 통합했다. 기존 별도 노트 URL은 Ch8의 같은 절로 이동한다. wiki 목차도 Ch8를 학습 진입점으로 유지한다.

문서 위치·탐색·디자인 검증

기존 강의 디자인에 맞춘 재조정

Ch6·Ch7을 1440px 실제 화면으로 비교하고 Ch7의 hero·범위 배지·파란 강조색·옅은 격자 배경·둥근 섹션 패널·왼쪽 study rail을 Ch8에 적용했다. 본문을 세 열에서 목차와 본문의 두 열로 조정했다. 코드 블록은 어두운 배경과 별도 구문 색상 토큰을 사용한다. 경로·고정 앵커·LAB 내부 디버깅 사례 위치는 유지한다.

교재 목차 재대조와 학습 흐름 정리

공식 자료와 대조한 결과

공식 3판 목차·서문 PDF의 인쇄 xiv쪽(PDF 14쪽)을 확인했다. 절 번호와 p.723~734 표기는 일치했다. HTML/Markdown에서 §8.2.3과 §8.2.4의 heading level이 잘못되어 있어 §8.2 아래로 복원했다. §8.1.3의 제목도 공식 명칭을 사용한다. 구조·쪽수 대조 기록.

교재 본문 범위는 §8.1~§8.2.4다. 이후 §8.2.5~§8.8은 미작성 범위로 명시했다. syscall ABI·Linux mapping은 공식 보충, fork LAB은 §8.4 선행 실습, Go·BEAM·Rust는 본문 뒤의 확장 자료로 구분했다. CMU 동반 강의의 슬라이드 15~17에 근거해 page fault·잘못된 메모리 참조 사례를 보강했고, 공식 정오표의 p.735 stack 주소·%rsp 정정을 반영했다.

학습 동선과 코드

스터디 교재 Global Edition 추가 대조

https://i.hyeon.me/csapp.pdf는 PDF가 아닌 200 응답의 HTML이며, meta refresh의 대상 PDF를 직접 열어 판본을 확인했다. 표제지(PDF 4쪽)는 CSAPP 3e Global Edition, 목차는 xv쪽(PDF 15쪽)이다. 북미판과 절 순서는 같지만 이번 범위의 인쇄 쪽수는 다르다. §8.1은 북미판 p.723 / Global p.759, §8.2.4는 p.734 / p.770이다. 대응표에 두 판을 병기했다.

실제 Global §8.1.3 p.765~767과 §8.2.2~§8.2.4 p.769~771을 읽고 일반 보호 예외·machine check·time slice 설명을 보강했다. 북미판 정오표의 그림 8.13은 Global판 p.771에서 대응한다. 다운로드한 교재 전문은 레포에 복제하지 않았고, 판본·URL·hash·쪽수만 대조 기록에 남겼다.