ARM GIC v3 in Linux Kernel
ARM GICv3의 컴포넌트 구성과 초기화 흐름은 별도 글에서 다뤘다. 그런데 막상 각 레지스터를 읽고 쓰는 실제 커널 코드를 보면 writel_relaxed() 한 줄로 끝나는 경우가 드물다. 하드웨어에 값을 쓴 뒤 그…
ARM 아키텍처
ARM GICv3의 컴포넌트 구성과 초기화 흐름은 별도 글에서 다뤘다. 그런데 막상 각 레지스터를 읽고 쓰는 실제 커널 코드를 보면 writel_relaxed() 한 줄로 끝나는 경우가 드물다. 하드웨어에 값을 쓴 뒤 그…
GICv2는 아키텍처상 PE(Processing Element, 코어)를 최대 8개까지만 지원한다. 서버·모바일 SoC의 코어 수가 계속 늘어나면서 이 상한이 실제 병목이 됐고, ARM은 GICv3에서 Distributor 하나가 모든 코어를 직접 상대하던 구조를 버리고 코어마다…
perf stat로 cycles, instructions, cache-misses 몇 개를 조합해 IPC와 미스율을 계산하는 건 코어 하나짜리 애플리케이션이라면 충분하다. 그런데 병목이 프론트엔드인지 백엔드인지까지 확인한 다음, 백엔드라면 그게 L1인지 L2인지 라스트레벨 캐시인지 TLB인지까지 계속…
시스템이 느려졌을 때 "CPU가 바쁜지" "메모리가 병목인지"를 구분하는 건 생각보다 어렵다. top의 CPU 사용률은 코어가 뭔가는 하고 있다는 것만 보여줄 뿐, 그 사이클이 실제 연산에 쓰였는지 메모리 응답을 기다리며 멈춰…
코드가 느린 게 캐시 미스 때문인지, 분기 예측 실패 때문인지, 아니면 그냥 명령어 수가 많아서인지는 로그나 타이머만으로는 알기 어렵다. wall clock 시간은 "얼마나 걸렸는지"만 알려줄 뿐, "왜 걸렸는지"는 알려주지 않는다.…
C 코드를 gcc -S로 컴파일해 어셈블리 출력을 구경해본 적은 있어도, 처음부터 어셈블리만으로 프로그램을 짜서 빌드하고 실행해본 경험은 드물다. 하지만 커널의 부팅 초기 코드, 예외/인터럽트 벡터 핸들러, 컨텍스트 스위칭처럼 C로는 표현할…
ARMv8부터 새로 추가된 64비트 명령어 집합 A64(AArch64 상태에서 실행)는 기존 32비트 ARM/Thumb(A32/T32)과 문법이 상당히 다르다. 레지스터 이름, 조건 코드, 주소 지정 방식을 매번 ARM 공식 문서에서 찾아보기는 번거롭기 때문에, 자주…
2026년 6월 1일 대만 컴퓨텍스 무대에서 젠슨 황 엔비디아 CEO는 "40년 만에 PC를 다시 발명하고 있다"고 선언하며 새 PC 플랫폼 'RTX 스파크(RTX Spark)'를 공개했습니다. 그동안 엔비디아는 데이터센터용 GPU와 Grace Hopper·Grace…
모든 ARM 명령어는 32비트 길이를 갖는다. 명령어들은 32비트 워드로 정렬되므로 명령어 주소의 최하위 2비트는 ARM 상태에서는 항상 0이다. 일부 명령어는 최하위 비트를 Thumb 코드인지 ARM코드 인지 확인한다. ARM Instruction Set…
ARM64(AArch64)에서 inline asm은 문법이 어렵다기보다, 컴파일러가 더 엄격하고 최적화가 더 공격적이라서 사고가 난다. 특히 벤더 커널을 Clang으로 옮길 때는 constraint 선택, clobber, barrier 세 가지가 대부분의 원인이다. 이 글에서는 ARM64에서…