Device Tree 이해
같은 SoC를 쓰는 보드라도 UART/GPIO 배선, 메모리 크기, 인터럽트 번호는 보드마다 다르다. 과거 ARM Linux는 이런 정보를 보드별 C 코드(board file)로 하드코딩했는데, 지원 보드가 수백 종으로 늘면서 커널 트리 유지보수가…
같은 SoC를 쓰는 보드라도 UART/GPIO 배선, 메모리 크기, 인터럽트 번호는 보드마다 다르다. 과거 ARM Linux는 이런 정보를 보드별 C 코드(board file)로 하드코딩했는데, 지원 보드가 수백 종으로 늘면서 커널 트리 유지보수가…
SSH로 서버에 접속할 때 Permission denied (publickey) 에러를 만나면 비밀번호도 못 쓰는 상태라 당황하기 쉽다. 이 에러는 서버가 클라이언트가 제시한 공개 키 중 어느 것도 인증에 성공시키지 못했다는 뜻인데, 원인이…
Yocto 빌드 중 pseudo-native의 do_compile 단계에서 이런 에러를 만날 때가 있다. gcc -c -isystem .../recipe-sysroot-native/usr/include -isystem .../recipe-sysroot-native/usr/include -m32 ... pseudo_util.c In file included from /usr/include/linux/stat.h:5, from /usr/include/bits/statx.h:31, from /usr/include/sys/stat.h:465, from…
컨테이너 런타임이나 브라우저 샌드박스가 "이 프로세스는 open, socket 같은 시스템 콜을 못 쓰게 막는다"고 할 때, 그 뒤에는 대부분 seccomp-bpf가 있다. Docker나 systemd의 SystemCallFilter=도 결국 libseccomp을 감싼 것일 뿐, 커널이…
파일 디스크립터를 안 닫는 코드 한 줄, 무한 재귀로 메모리를 다 먹는 버그 하나가 서버 프로세스 전체를 멎게 만드는 경우가 있다. 셸의 ulimit 대신, 파이썬 프로세스 내부에서 동적으로 조회하거나 특정…
ARM64 서버나 모바일 SoC에서 배열 연산이 많은 코드를 최적화할 때 "컴파일러가 알아서 벡터화해주겠지"라고 믿고 넘어가기 쉽다. 하지만 최적화 레벨이나 포인터 별칭(aliasing) 여부에 따라 auto-vectorization이 조용히 실패하고 스칼라 코드가 그대로 나오는…
서버에 서비스가 늘어날수록 로그도 /var/log/syslog, 각 서비스별 파일, 커널 dmesg로 흩어지고, 장애가 나면 여러 파일을 시간순으로 짜맞춰야 하는 상황이 생긴다. Ubuntu는 기본적으로 systemd-journald가 커널·서비스·유저 로그를 구조화된 바이너리 포맷 하나로 모아두고…
cron 배치가 예상보다 오래 걸려 다음 스케줄과 겹치면, 두 인스턴스가 같은 파일에 동시에 써서 데이터가 꼬이는 사고가 난다. PID 파일로 막는 방식은 프로세스가 비정상 종료되면 파일만 남아 다음 실행을 영영…
ARMv8.0의 원자적 연산은 LL/SC(Load-Linked/Store-Conditional) 방식이다 — ldxr로 값을 읽고 연산한 뒤 stxr로 조건부 저장하는데, 그사이 다른 코어가 같은 주소를 건드리면 저장이 실패해 처음부터 재시도한다. 코어 수가 많아질수록 이 재시도가 잦아져…
리눅스 6.6부터 CFS를 대체한 EEVDF 스케줄러의 vruntime/eligible time/deadline 같은 개념은 이 블로그의 이전 글에서 다뤘다. 이 글은 그 개념이 실제로 어떤 구조체와 함수로 구현되어 있는지, kernel/sched/fair.c(6.18 기준) 소스를 직접 따라가며…