이 코드는 어떤 문제를 푸나요?
범용 IRQ 자료구조가 준비된 뒤에는 아키텍처와 장치에 맞는 수신 경로가 필요합니다. ARM64의 init_IRQ는 IRQ 처리용 스택과 보호 상태를 만들고 irqchip 초기화를 연결합니다. 우선순위 기반 마스킹을 쓰는지에 따라 DAIF 처리도 달라집니다.
읽을 범위: v6.18.37 · arch/arm64/kernel/irq.c · init_IRQ 110–124행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.
먼저 알아둘 개념
IRQ 스택
인터럽트 처리에 사용할 별도 스택입니다. 일반 태스크 스택과 역할을 구분합니다.
DAIF와 우선순위 마스크
예외 마스크 비트와 컨트롤러의 우선순위 제어는 서로 다른 계층입니다.
처음 읽을 때
코드를 읽을 때 IRQ 처리 스택과 shadow call stack을 준비합니다. 그다음 어느 상태가 바뀌는지 각 줄에서 확인하세요.
더 깊이 살펴볼 때
이 경로의 호출 문맥, 잠금·인터럽트 상태, 오류 시 남는 자원을 함께 추적해 보세요. 호출된 함수가 수행하는 작업과 현재 함수가 직접 보장하는 범위를 구분하는 것이 중요합니다.
그림으로 보는 변화

1. 스택 준비
IRQ 처리 스택과 shadow call stack을 준비합니다.
순서를 보여 주며 스택 내용 전체 복사가 아닙니다.
2. irqchip 연결
플랫폼에 맞는 인터럽트 컨트롤러 초기화를 호출합니다.
하나의 특정 GIC 모델로 고정하지 않습니다.
3. 마스크 상태 정리
우선순위 마스킹 사용 조건에서 DAIF 상태를 확인하고 맞춥니다.
조건을 만족할 때만 해당 상태 전환을 수행합니다.
init_IRQ를 한 줄씩 읽기
줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.
void __init init_IRQ(void)
{
init_irq_stacks();
init_irq_scs();
irqchip_init();
if (system_uses_irq_prio_masking()) {
/*
* Now that we have a stack for our IRQ handler, set
* the PMR/PSR pair to a consistent state.
*/
WARN_ON(read_sysreg(daif) & PSR_A_BIT);
local_daif_restore(DAIF_PROCCTX_NOIRQ);
}
}void __init init_IRQ(void)arm64에서 CPU별 IRQ 스택과 IRQ 컨트롤러 초기화를 연결합니다. 소프트웨어 IRQ 번호 관리가 준비된 뒤 실제 예외 처리 경로와 하드웨어를 사용할 수 있게 합니다.
init_irq_stacks();IRQ 처리에 사용할 CPU별 스택을 준비합니다.
init_irq_scs();IRQ 문맥의 반환 주소 보호용 shadow call stack을 준비합니다.
irqchip_init();DT나 ACPI 등 플랫폼 정보에 따라 인터럽트 컨트롤러 드라이버 초기화를 연결합니다.
if (system_uses_irq_prio_masking()) {CPU 예외 마스크와 별도로 IRQ 우선순위 마스킹을 쓰는 구성인지 확인합니다.
WARN_ON(read_sysreg(daif) & PSR_A_BIT);DAIF의 A 비트가 아직 설정되어 SError가 가려져 있는지 확인합니다. 앞 setup_arch가 SError를 이미 허용했다는 초기화 순서를 검증하며 일반 IRQ의 I 비트를 검사하는 줄이 아닙니다.
local_daif_restore(DAIF_PROCCTX_NOIRQ);정해 둔 D/A/I/F 예외 마스크 상태로 맞춥니다. 일반 IRQ 비트 하나만 쓰는 것으로 단순화하지 않습니다.
함께 생각해 볼 질문
init_IRQ와 early_irq_init은 같은가요?
전자는 아키텍처 경로, 후자는 범용 IRQ 자료구조 준비에 초점을 둡니다.
shadow stack은 일반 SP와 같은가요?
반환 주소 보호를 위해 별도로 관리하는 상태입니다.
우선순위 마스킹 분기는 모든 CPU에서 실행되나요?
런타임 구성과 기능 조건을 확인한 경우에만 들어갑니다.
출처와 읽은 범위
Linux stable v6.18.37 · arch/arm64/kernel/irq.c
해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고
