Arm GIC v3와 Pseudo-NMI에 대한 이해

x86에는 IRQ 마스크와 무관하게 항상 들어오는 진짜 NMI(Non-Maskable Interrupt) 핀이 있지만, ARM에는 그런 하드웨어가 없다. 그런데 PMU(성능 카운터) 오버플로우 인터럽트처럼 "일반 IRQ가 막혀 있는 구간에서도 반드시 들어와야" 정확한 프로파일링이 되는…

Continue ReadingArm GIC v3와 Pseudo-NMI에 대한 이해

[ARM] arch_has_hw_pte_young() 이해

MGLRU(Multi-Gen LRU) 페이지 에이징이나 fork() 이후 CoW(Copy-on-Write) 처리처럼, 커널이 "이 페이지가 최근에 접근됐는가"를 알아야 하는 곳이 많다. 이걸 알아내는 방법은 두 가지다 — 오래된 PTE에 접근할 때마다 일부러 페이지 폴트를…

Continue Reading[ARM] arch_has_hw_pte_young() 이해

perf 소프트웨어 이벤트로 CPU 병목 진단하기

클라우드 VM이나 컨테이너에서 perf stat -e cycles를 돌리면 "not supported"만 뜨고 아무것도 안 나오는 경우가 흔하다. 하이퍼바이저가 하드웨어 성능 카운터(PMU)를 게스트에 노출하지 않기 때문인데, IPC나 캐시 미스 같은 마이크로아키텍처 지표는…

Continue Readingperf 소프트웨어 이벤트로 CPU 병목 진단하기

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

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

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

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

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

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

ARM SVE(Scalable Vector Extension)로 가변 길이 벡터 연산 다루기

NEON은 레지스터 폭이 128비트로 고정돼 있어 배열 길이가 4의 배수가 아니면 스칼라 tail 루프를 따로 짜야 하고, 128비트부터 2048비트까지 벡터 폭이 다양한 ARM 생태계에서도 컴파일 타임에 고정된 128비트씩만 처리한다 —…

Continue ReadingARM SVE(Scalable Vector Extension)로 가변 길이 벡터 연산 다루기

ARM Pointer Authentication(PAC)와 BTI로 ROP/JOP 공격 막기

스택 카나리·NX/DEP·ASLR로 오랫동안 막아온 리턴 주소 조작을, 공격자는 새 코드 주입 대신 기존 코드 조각을 이어붙이는 ROP/JOP로 우회해왔다. ARM은 ARMv8.3-A의 Pointer Authentication(PAC)과 ARMv8.5-A의 Branch Target Identification(BTI)으로 이를 하드웨어 레벨에서 막는다.…

Continue ReadingARM Pointer Authentication(PAC)와 BTI로 ROP/JOP 공격 막기

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

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

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

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

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

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