리눅스 커널에서 scatter-gather DMA 이해하기

디바이스에 넘길 버퍼가 물리적으로 연속되어 있다는 보장은 없다. vmalloc으로 받은 큰 버퍼는 물리 페이지가 여기저기 흩어져 있고, 네트워크 패킷처럼 여러 조각(헤더+페이로드)을 한 번의 전송으로 묶어야 하는 경우도 흔하다. scatter-gather DMA는…

Continue Reading리눅스 커널에서 scatter-gather DMA 이해하기

라즈베리파이 부트로더 빌드 및 업데이트 방법

라즈베리파이 4/5 계열은 부트로더가 보드 위 EEPROM에 저장되어 있고, rpi-eeprom-update로 최신 버전으로 갱신할 수 있다. "부트로더를 빌드한다"는 말 때문에 소스를 내려받아 컴파일하는 과정을 떠올리기 쉬운데, 실제로는 다르다. rpi-eeprom 저장소에는 이미…

Continue Reading라즈베리파이 부트로더 빌드 및 업데이트 방법

ARM64 MTE(Memory Tagging Extension) — 하드웨어 메모리 태깅으로 KASAN을 대체하는 방법

KASAN이나 KFENCE 같은 소프트웨어 메모리 안전성 도구는 결국 소프트웨어다 — 섀도 메모리를 따로 관리하거나(KASAN), 확률적으로 일부 할당만 감시하거나(KFENCE), 어느 쪽이든 CPU 사이클을 써서 검사 로직을 흉내낸다. MTE(Memory Tagging Extension)는 이…

Continue ReadingARM64 MTE(Memory Tagging Extension) — 하드웨어 메모리 태깅으로 KASAN을 대체하는 방법

라즈베리파이 Device Tree Overlay 원리 — fragment/fixup을 dtc로 직접 확인하기

라즈베리파이에 센서나 디스플레이를 하나 새로 붙일 때마다 base device tree(.dtb) 전체를 다시 컴파일해서 부트 파티션에 올리는 건 번거롭고, 보드마다 다른 base tree를 관리해야 하는 상황과도 잘 안 맞는다. Device Tree…

Continue Reading라즈베리파이 Device Tree Overlay 원리 — fragment/fixup을 dtc로 직접 확인하기

pahole과 BTF로 구조체 메모리 레이아웃 확인하기 — 패딩부터 커널 라이브 구조체까지

구조체 필드 순서가 메모리 낭비와 캐시 효율에 영향을 준다는 건 다들 안다. 문제는 "그래서 지금 이 구조체가 얼마나 낭비하고 있는지"를 눈으로 확인하기가 쉽지 않다는 것이다. pahole은 DWARF 디버그 정보나 커널의…

Continue Readingpahole과 BTF로 구조체 메모리 레이아웃 확인하기 — 패딩부터 커널 라이브 구조체까지

Ubuntu AppArmor 커스텀 프로파일 작성하기 — merged /usr와 apparmor-utils에서 실제로 겪은 문제

프로세스 하나가 뚫리면 그 프로세스가 가진 권한 전체가 그대로 노출된다. 파일 소유권이나 setuid만으로는 "이 프로그램은 딱 이 파일 몇 개만 건드릴 수 있다"는 세밀한 통제가 안 된다. AppArmor는 경로 기반…

Continue ReadingUbuntu AppArmor 커스텀 프로파일 작성하기 — merged /usr와 apparmor-utils에서 실제로 겪은 문제

Python os.eventfd()로 이벤트 알림 다루기 — 카운터 누적부터 poll 이벤트 루프 깨우기까지

스레드 간, 또는 프로세스 간에 "무슨 일이 일어났다"는 신호 하나만 가볍게 보내고 싶을 때 파이프나 소켓은 다소 과하다. eventfd는 커널이 관리하는 64비트 정수 카운터 하나를 파일 디스크립터로 노출해서, select/poll/epoll 같은…

Continue ReadingPython os.eventfd()로 이벤트 알림 다루기 — 카운터 누적부터 poll 이벤트 루프 깨우기까지

리누스 토르발스 “리눅스는 반AI 프로젝트 아니다” — 이미 시행 중인 Assisted-by 태그 정책까지

2024년 10월만 해도 리누스 토르발스는 AI 코딩 도구를 두고 "90%는 마케팅 과장"이라며 무시하겠다고 말했습니다. 2026년 7월 15일, 그는 정반대에 가까운 어조로 리눅스 커널 메일링 리스트에 이렇게 썼습니다. "Linux is not…

Continue Reading리누스 토르발스 “리눅스는 반AI 프로젝트 아니다” — 이미 시행 중인 Assisted-by 태그 정책까지

RCU(Read-Copy-Update) 기초 — rcu_read_lock부터 synchronize_rcu까지 실제로 확인하기

라우팅 테이블이나 설정 캐시처럼 읽기는 압도적으로 많고 쓰기는 어쩌다 한 번인 자료구조에 일반 락(mutex/spinlock)을 쓰면, 정작 서로 방해할 일이 없는 리더끼리도 락 때문에 경합한다. RCU(Read-Copy-Update)는 리더 쪽을 아예 락-프리로 만들어버리는…

Continue ReadingRCU(Read-Copy-Update) 기초 — rcu_read_lock부터 synchronize_rcu까지 실제로 확인하기

GDB record full로 역방향 디버깅하기 — 하드웨어 카운터 없이 되감는 rr 대안

워치포인트로 "이 변수가 언제 바뀌는지"는 잡을 수 있어도, 그 값이 왜 그렇게 됐는지 되짚어 올라가려면 결국 브레이크포인트를 다시 걸고 처음부터 재실행하기를 반복하게 된다. Mozilla의 rr 같은 record-and-replay 디버거는 실행을 통째로…

Continue ReadingGDB record full로 역방향 디버깅하기 — 하드웨어 카운터 없이 되감는 rr 대안