Device Tree 이해

같은 SoC를 쓰는 보드라도 UART/GPIO 배선, 메모리 크기, 인터럽트 번호는 보드마다 다르다. 과거 ARM Linux는 이런 정보를 보드별 C 코드(board file)로 하드코딩했는데, 지원 보드가 수백 종으로 늘면서 커널 트리 유지보수가…

Continue ReadingDevice Tree 이해

asm/types.h: No such file or directory 문제 (Yocto pseudo-native)

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…

Continue Readingasm/types.h: No such file or directory 문제 (Yocto pseudo-native)

seccomp-bpf로 리눅스 커널 시스템 콜 화이트리스트 필터링하기

컨테이너 런타임이나 브라우저 샌드박스가 "이 프로세스는 open, socket 같은 시스템 콜을 못 쓰게 막는다"고 할 때, 그 뒤에는 대부분 seccomp-bpf가 있다. Docker나 systemd의 SystemCallFilter=도 결국 libseccomp을 감싼 것일 뿐, 커널이…

Continue Readingseccomp-bpf로 리눅스 커널 시스템 콜 화이트리스트 필터링하기

Python resource 모듈로 프로세스 리소스 제한(RLIMIT) 다루기

파일 디스크립터를 안 닫는 코드 한 줄, 무한 재귀로 메모리를 다 먹는 버그 하나가 서버 프로세스 전체를 멎게 만드는 경우가 있다. 셸의 ulimit 대신, 파이썬 프로세스 내부에서 동적으로 조회하거나 특정…

Continue ReadingPython resource 모듈로 프로세스 리소스 제한(RLIMIT) 다루기

ARM64 NEON 인트린식으로 SIMD 벡터 연산 가속하기

ARM64 서버나 모바일 SoC에서 배열 연산이 많은 코드를 최적화할 때 "컴파일러가 알아서 벡터화해주겠지"라고 믿고 넘어가기 쉽다. 하지만 최적화 레벨이나 포인터 별칭(aliasing) 여부에 따라 auto-vectorization이 조용히 실패하고 스칼라 코드가 그대로 나오는…

Continue ReadingARM64 NEON 인트린식으로 SIMD 벡터 연산 가속하기

Ubuntu journald로 시스템 로그 관리하기

서버에 서비스가 늘어날수록 로그도 /var/log/syslog, 각 서비스별 파일, 커널 dmesg로 흩어지고, 장애가 나면 여러 파일을 시간순으로 짜맞춰야 하는 상황이 생긴다. Ubuntu는 기본적으로 systemd-journald가 커널·서비스·유저 로그를 구조화된 바이너리 포맷 하나로 모아두고…

Continue ReadingUbuntu journald로 시스템 로그 관리하기

flock으로 Bash 스크립트 동시 실행 방지하기

cron 배치가 예상보다 오래 걸려 다음 스케줄과 겹치면, 두 인스턴스가 같은 파일에 동시에 써서 데이터가 꼬이는 사고가 난다. PID 파일로 막는 방식은 프로세스가 비정상 종료되면 파일만 남아 다음 실행을 영영…

Continue Readingflock으로 Bash 스크립트 동시 실행 방지하기

ARMv8.1 LSE 원자적 연산: LL/SC와 실제 컴파일 결과 비교

ARMv8.0의 원자적 연산은 LL/SC(Load-Linked/Store-Conditional) 방식이다 — ldxr로 값을 읽고 연산한 뒤 stxr로 조건부 저장하는데, 그사이 다른 코어가 같은 주소를 건드리면 저장이 실패해 처음부터 재시도한다. 코어 수가 많아질수록 이 재시도가 잦아져…

Continue ReadingARMv8.1 LSE 원자적 연산: LL/SC와 실제 컴파일 결과 비교

리눅스 스케줄러 자료구조로 보는 CFS/EEVDF: sched_entity와 cfs_rq

리눅스 6.6부터 CFS를 대체한 EEVDF 스케줄러의 vruntime/eligible time/deadline 같은 개념은 이 블로그의 이전 글에서 다뤘다. 이 글은 그 개념이 실제로 어떤 구조체와 함수로 구현되어 있는지, kernel/sched/fair.c(6.18 기준) 소스를 직접 따라가며…

Continue Reading리눅스 스케줄러 자료구조로 보는 CFS/EEVDF: sched_entity와 cfs_rq