pahole과 BTF로 구조체 메모리 레이아웃 확인하기 — 패딩부터 커널 라이브 구조체까지
구조체 필드 순서가 메모리 낭비와 캐시 효율에 영향을 준다는 건 다들 안다. 문제는 "그래서 지금 이 구조체가 얼마나 낭비하고 있는지"를 눈으로 확인하기가 쉽지 않다는 것이다. pahole은 DWARF 디버그 정보나 커널의…
구조체 필드 순서가 메모리 낭비와 캐시 효율에 영향을 준다는 건 다들 안다. 문제는 "그래서 지금 이 구조체가 얼마나 낭비하고 있는지"를 눈으로 확인하기가 쉽지 않다는 것이다. pahole은 DWARF 디버그 정보나 커널의…
KASAN은 힙 오버플로우나 use-after-free를 잡아내는 데 강력하지만, 모든 할당에 리다이렉션 존(redzone)과 섀도 메모리 검사를 붙이는 방식이라 오버헤드가 크고 프로덕션에 상시 켜두기는 부담스럽다. KFENCE(Kernel Electric-Fence)는 이 문제를 확률적 샘플링으로 우회한다 —…
ARM GICv3의 컴포넌트 구성과 초기화 흐름은 별도 글에서 다뤘다. 그런데 막상 각 레지스터를 읽고 쓰는 실제 커널 코드를 보면 writel_relaxed() 한 줄로 끝나는 경우가 드물다. 하드웨어에 값을 쓴 뒤 그…
업스트림 소스를 --depth 1로 clone해 rust_minimal.o를 빌드하는 데는 성공했지만, 그 트리는 지금 부팅된 우분투 배포 커널과 버전이 다른 별개의 트리였다. 실제로 insmod까지 되려면 지금 실행 중인 커널 자체를 기준으로 빌드해야…
1~3부에서 최소 모듈, misc device, 인터럽트 동기화를 각각 다뤘는데, 매번 module! 매크로부터 새로 채워나갔다. 실제로 새 모듈을 시작할 때는 그 반대가 편하다 — 어떤 필드가 필수고 어떤 게 선택인지, 초기화…
2부에서는 misc device의 상태를 Mutex로 보호했다. 그런데 Mutex::lock()은 경합이 발생하면 현재 태스크를 재웠다가 나중에 깨우는 방식으로 동작한다. 하드웨어 인터럽트 핸들러(hardirq context)는 애초에 "태스크"라는 개념이 없는 컨텍스트라 이 방식이 통하지 않는다.…
지난 글에서 살펴본 rust_minimal.rs는 로드되면 로그 몇 줄을 찍고 언로드되면 사라지는, 사실상 아무 일도 하지 않는 모듈이었다. 실제 드라이버라면 얘기가 다르다. 유저스페이스가 open()으로 열고, read()/write()로 데이터를 주고받고, ioctl()로 제어 명령을…
리눅스 커널 CVE 목록을 오래 들여다본 사람이라면 use-after-free, 버퍼 오버플로우, 널 포인터 역참조 같은 메모리 안전성 버그가 얼마나 자주 반복되는지 알 것이다. 리눅스 안정 커널 메인테이너 그렉 크로아-하트만은 지난 25년간의…
io_uring을 쓰는 프로그램은 한 번에 여러 비동기 작업을 던져놓고 진행 상황을 추적한다. 그 말은 곧 커널 내부의 io_uring 서브시스템이 처리해야 할 작업(task) 목록을 항상 관리하고 있어야 한다는 뜻이다. 지금까지 io_uring은…
라즈베리파이OS 기본 커널은 일반 목적 스케줄러를 쓰기 때문에, 인터럽트가 몰리거나 시스템 부하가 커지면 특정 태스크의 응답 시간이 수 밀리초에서 수십 밀리초까지 튈 수 있다. 로봇 제어, 모터 구동, 오디오 프로세싱처럼…