← DUJINLABS.COM head.S 글

Linux Kernel Series · 6.18.37 LTS 기준

Linux Kernel 연구 노트

한 페이지에 커널 전체를 밀어 넣지 않습니다. boot, init, memory, scheduler, syscall, filesystem, block, network, driver, locking, RCU처럼 실제 코드 흐름이 갈리는 지점마다 별도 글로 나눕니다.

심화 노트

기준 버전은 kernel.org longterm 최신인 Linux 6.18.37 LTS로 고정합니다. 글마다 소스 코드 위치, 실제 코드 발췌, 전체 흐름, 필드 표, 상태 변화 표, 계측 지점를 붙입니다. 함수 하나를 구조체와 흐름 그림에 붙여 읽는 형식으로 정리합니다.

완료

01. arm64 head.S 라인 바이 라인

Image header, primary_entry, idmap, MMU enable, EL1/EL2, secondary CPU, relocation.

도식+코드

02. init/main.c:start_kernel()

head.S 이후 C entry. arch setup, command line, memory, scheduler, IRQ, rest_init 흐름.

원본+줄별 주석

03. x86-64 boot entry와 CR3 전환

startup_32, 두 startup_64, decompression, 4/5-level paging, high VA 진입.

원본+줄별 주석

04. RISC-V 64 head.S와 SATP 전환

Image header, hart ID, DTB, setup_vm, trampoline page table, start_kernel.

Architecture

arm64 / x86-64 / RISC-V 비교

Linux 6.18.37의 같은 kernel contract가 세 architecture에서 어느 register, page-table format, interrupt controller와 firmware 경계로 구현되는지 21개 주제로 나눴습니다. 각 글에는 세 원본 코드와 발췌된 모든 줄의 설명, 동작 그림, 수치 예제와 계측 절차가 들어 있습니다.

Exception / IRQ / ABI

3 ARCH

Exception entry: vector table, IDT와 trap entry

CPU가 비동기 interrupt, synchronous fault, debug exception을 감지한 순간부터 pt_regs가 완성되고 C handler로 넘어갈 때까지를 세 ISA에서 나란히 읽습니다.

3 ARCH

IRQ controller: GICv3, local APIC/IOAPIC와 RISC-V INTC

device가 interrupt line이나 MSI를 올린 뒤 CPU가 interrupt ID를 읽고 irq_desc handler를 실행하고 EOI하는 전체 경로를 controller 관점에서 비교합니다.

3 ARCH

IPI와 SMP call: SGI, APIC ICR와 SBI/IMSIC

한 CPU가 다른 CPU에 reschedule, call-function, TLB flush, stop 요청을 보내고 완료를 기다리는 과정을 세 architecture의 mailbox와 interrupt mechanism으로 분석합니다.

3 ARCH

System call entry: SVC, SYSCALL과 ECALL

user ABI register에서 syscall number와 argument를 꺼내 seccomp, ptrace, audit를 거쳐 handler를 호출하고 user mode로 돌아가는 경로를 비교합니다.

3 ARCH

Signal frame과 user context 복원

kernel이 pending signal을 선택한 뒤 user stack에 rt_sigframe을 쓰고 handler로 PC를 바꾸며, rt_sigreturn이 register와 extended state를 복원하는 과정을 비교합니다.

3 ARCH

ptrace와 hardware debug register

debugger가 task를 정지시키고 register set, breakpoint, single-step 상태를 읽고 쓰는 경로를 architecture regset과 hardware slot 관점에서 비교합니다.

3 ARCH

Timer와 clocksource: architected timer, TSC와 RISC-V time

kernel이 단조 증가 시간을 읽고 다음 hrtimer deadline을 hardware comparator에 설정하며 CPU별 clock event를 처리하는 방식을 비교합니다.

Platform / virtualization / boot

3 ARCH

DMA, cache coherency와 IOMMU translation

driver가 CPU virtual address를 DMA address로 바꾼 뒤 device가 memory를 읽고 쓰며, IOMMU와 non-coherent cache maintenance가 그 주소와 ownership을 어떻게 보호하는지 비교합니다.

3 ARCH

PCIe MSI/MSI-X와 interrupt remapping

device가 특정 memory address에 data를 쓰는 MSI transaction이 GIC ITS, x86 APIC remapping, RISC-V IMSIC interrupt file로 변환되는 과정을 비교합니다.

3 ARCH

CPU idle, suspend와 resume context

CPU가 clock gating부터 system suspend까지 내려가면서 어느 register와 cache/coherency 상태를 잃고, firmware에서 돌아온 뒤 어떤 순서로 Linux execution context를 복구하는지 비교합니다.

3 ARCH

KVM virtualization: EL2, VMX/SVM과 RISC-V H-extension

KVM_RUN ioctl이 vCPU state를 hardware virtualization context에 넣고 guest를 실행한 뒤 exit reason을 host 또는 userspace가 처리하는 과정을 비교합니다.

3 ARCH

Stack unwind, function tracing과 return address 보호

panic, perf, ftrace와 live debugging이 현재 instruction에서 caller chain을 복원하는 방법과 compiler가 제공해야 하는 metadata를 비교합니다.

3 ARCH

Kernel module relocation과 instruction range

ELF module의 section을 vmalloc 영역에 배치하고 architecture relocation을 적용해 symbol address와 instruction immediate를 고치는 방법을 비교합니다.

3 ARCH

Boot firmware handoff: DTB, ACPI, EFI와 setup_arch

bootloader/firmware가 kernel image, memory map, CPU topology와 command line을 넘긴 뒤 각 architecture가 early mapping과 platform description을 확정하는 과정을 비교합니다.

Boot / Init

Memory

Scheduler

IRQ / Time

Process / Syscall

File System

Block / Storage

Network

Driver / Device

Locking / RCU