심화 노트
기준 버전은 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
ARMv9-A 아키텍처 완전 해설
비전공자용 개념 해설 5편에서 시작해 Exception·MMU·Realm·SVE/SME·MTE·KVM·GIC·SMMU의 Linux v6.18.37 소스 분석 8편까지 이어집니다.
arm64arm64 head.S
Image header, EL 전환, idmap, MMU와 secondary CPU.
x86-64Boot entry / paging
startup_32, compressed startup_64, CR3와 high virtual address.
x86-64IDT / syscall / SMP
pt_regs frame, APIC vector, SYSCALL, secondary CPU startup.
RISC-V 64head.S / SATP
hart ID, DTB, setup_vm, trampoline mapping과 start_kernel.
RISC-V 64Trap / SBI / SMP
sscratch, scause, pt_regs, secondary hart와 online 경계.
arm64 / x86-64 / RISC-V 비교
Linux 6.18.37의 같은 kernel contract가 세 architecture에서 어느 register, page-table format, interrupt controller와 firmware 경계로 구현되는지 21개 주제로 나눴습니다. 각 글에는 세 원본 코드와 발췌된 모든 줄의 설명, 동작 그림, 수치 예제와 계측 절차가 들어 있습니다.
Execution context
Context switch: callee-saved register와 task state
scheduler의 공통 context_switch() 아래에서 arm64, x86-64, RISC-V가 어떤 register와 thread state를 저장하고 다음 task에 넘기는지 읽습니다.
FPU, SIMD, SVE/SME, XSAVE와 RISC-V Vector state
integer context보다 훨씬 큰 extended register state를 언제 저장하고 언제 복원하는지, lazy ownership과 signal frame까지 연결합니다.
Memory translation / ordering
Page-table format: PTE bit, level과 huge mapping
같은 Linux PTE API 아래에서 arm64 descriptor, x86-64 PTE와 RISC-V Sv39/Sv48 PTE가 어떤 bit와 level을 사용하는지 비교합니다.
3 ARCHAddress-space switch: TTBR, CR3/PCID와 SATP/ASID
task의 mm_struct가 바뀔 때 page-table root와 ASID/PCID를 재사용하고 generation wrap을 처리하는 방식을 비교합니다.
TLB shootdown: TLBI, INVLPG/INVPCID와 SFENCE.VMA
PTE 변경을 다른 CPU가 언제부터 관찰하는지 range flush, ASID tag, IPI와 completion 경계로 분석합니다.
3 ARCHCache coherency와 memory barrier: DMB/DSB, x86 ordering, FENCE
compiler barrier, SMP barrier, DMA barrier와 instruction-cache synchronization을 서로 다른 계약으로 나눕니다.
3 ARCHAtomic RMW와 spinlock: LSE/LL-SC, LOCK과 AMO
atomic API의 relaxed/acquire/release/full variant가 세 ISA에서 어떤 instruction과 retry loop로 내려가는지 읽습니다.
Exception / IRQ / ABI
Exception entry: vector table, IDT와 trap entry
CPU가 비동기 interrupt, synchronous fault, debug exception을 감지한 순간부터 pt_regs가 완성되고 C handler로 넘어갈 때까지를 세 ISA에서 나란히 읽습니다.
3 ARCHIRQ controller: GICv3, local APIC/IOAPIC와 RISC-V INTC
device가 interrupt line이나 MSI를 올린 뒤 CPU가 interrupt ID를 읽고 irq_desc handler를 실행하고 EOI하는 전체 경로를 controller 관점에서 비교합니다.
3 ARCHIPI와 SMP call: SGI, APIC ICR와 SBI/IMSIC
한 CPU가 다른 CPU에 reschedule, call-function, TLB flush, stop 요청을 보내고 완료를 기다리는 과정을 세 architecture의 mailbox와 interrupt mechanism으로 분석합니다.
3 ARCHSystem call entry: SVC, SYSCALL과 ECALL
user ABI register에서 syscall number와 argument를 꺼내 seccomp, ptrace, audit를 거쳐 handler를 호출하고 user mode로 돌아가는 경로를 비교합니다.
3 ARCHSignal frame과 user context 복원
kernel이 pending signal을 선택한 뒤 user stack에 rt_sigframe을 쓰고 handler로 PC를 바꾸며, rt_sigreturn이 register와 extended state를 복원하는 과정을 비교합니다.
3 ARCHptrace와 hardware debug register
debugger가 task를 정지시키고 register set, breakpoint, single-step 상태를 읽고 쓰는 경로를 architecture regset과 hardware slot 관점에서 비교합니다.
3 ARCHTimer와 clocksource: architected timer, TSC와 RISC-V time
kernel이 단조 증가 시간을 읽고 다음 hrtimer deadline을 hardware comparator에 설정하며 CPU별 clock event를 처리하는 방식을 비교합니다.
Platform / virtualization / boot
DMA, cache coherency와 IOMMU translation
driver가 CPU virtual address를 DMA address로 바꾼 뒤 device가 memory를 읽고 쓰며, IOMMU와 non-coherent cache maintenance가 그 주소와 ownership을 어떻게 보호하는지 비교합니다.
3 ARCHPCIe MSI/MSI-X와 interrupt remapping
device가 특정 memory address에 data를 쓰는 MSI transaction이 GIC ITS, x86 APIC remapping, RISC-V IMSIC interrupt file로 변환되는 과정을 비교합니다.
3 ARCHCPU idle, suspend와 resume context
CPU가 clock gating부터 system suspend까지 내려가면서 어느 register와 cache/coherency 상태를 잃고, firmware에서 돌아온 뒤 어떤 순서로 Linux execution context를 복구하는지 비교합니다.
3 ARCHKVM virtualization: EL2, VMX/SVM과 RISC-V H-extension
KVM_RUN ioctl이 vCPU state를 hardware virtualization context에 넣고 guest를 실행한 뒤 exit reason을 host 또는 userspace가 처리하는 과정을 비교합니다.
3 ARCHStack unwind, function tracing과 return address 보호
panic, perf, ftrace와 live debugging이 현재 instruction에서 caller chain을 복원하는 방법과 compiler가 제공해야 하는 metadata를 비교합니다.
3 ARCHKernel module relocation과 instruction range
ELF module의 section을 vmalloc 영역에 배치하고 architecture relocation을 적용해 symbol address와 instruction immediate를 고치는 방법을 비교합니다.
3 ARCHBoot firmware handoff: DTB, ACPI, EFI와 setup_arch
bootloader/firmware가 kernel image, memory map, CPU topology와 command line을 넘긴 뒤 각 architecture가 early mapping과 platform description을 확정하는 과정을 비교합니다.
Boot / Init
arm64 Image header
부트로더가 Image를 인식하는 64-byte header.
완료primary_entry
MMU 상태 기록, boot args 저장, idmap 생성.
완료__primary_switch
MMU enable, KASLR, relocation, __primary_switched.
도식+코드start_kernel()
C 코드 진입 후 첫 번째 큰 초기화 흐름.
도식+코드setup_arch()
arch-specific memory, dtb, cpu, paging setup.
도식+코드rest_init()
pid 1 init, kthreadd, idle thread 전환.
도식+코드kernel_init_freeable()
initcall, rootfs, namespace 준비.
도식+코드init process 실행
/init, init=, rdinit=, /sbin/init fallback.
Memory
memblock
buddy allocator 전 early physical memory 관리.
도식+코드paging_init
architecture page table 초기화.
도식+코드mm_core_init
page allocator, slab, vmalloc로 넘어가는 관문.
도식+코드buddy allocator
zone, free_area, order 기반 page 할당.
도식+코드SLUB
kmem_cache, object allocator, per-cpu freelist.
도식+코드vmalloc
불연속 physical page를 연속 VA로 제공.
도식+코드page fault
do_page_fault, handle_mm_fault, fault flags.
도식+코드reclaim
LRU, shrinker, kswapd, direct reclaim.
도식+코드compaction
high-order allocation 실패와 page migration.
Scheduler
sched_init
runqueue, idle task, scheduler class 초기화.
도식+코드CFS
vruntime, rb-tree, fair scheduling.
도식+코드RT scheduler
rt_rq, priority, push/pull balancing.
도식+코드scheduler tick
timer tick, preemption, time slice accounting.
도식+코드load balancing
sched domain, cpu capacity, migration.
도식+코드NOHZ
tickless idle와 scheduler accounting.
IRQ / Time
early_irq_init
irq_desc와 irq domain 초기 틀.
도식+코드init_IRQ
architecture interrupt controller 초기화.
도식+코드GIC
arm64 GIC distributor, redistributor, irqchip.
x86-64IDT / APIC
x86-64 exception, hardware IRQ, syscall과 AP startup.
RISC-V 64Trap / SBI IPI
scause dispatch, trap frame과 secondary hart.
도식+코드softirq
softirq vector, ksoftirqd, bottom half.
도식+코드hrtimer
high-resolution timer와 clockevent.
도식+코드timekeeping
clocksource, jiffies, sched_clock.
Process / Syscall
File System
vfs_caches_init
dentry, inode, file cache 초기화.
도식+코드path lookup
namei, dcache, mount crossing.
도식+코드open/read/write
file descriptor부터 file_operations까지.
도식+코드page cache
address_space, folio, readahead, writeback.
도식+코드ext4
superblock, inode, journal, extent.
도식+코드f2fs
flash-friendly layout, segment, node, checkpoint.