μ½˜ν…μΈ λ‘œ κ±΄λ„ˆλ›°κΈ°

Linux Kernel – 3 System Call Flows and Kernel Component Differences by Architecture🧠

μ•„ν‚€ν…μ²˜κ°€ 달라지면 컀널 λ‚΄λΆ€μ—μ„œ μ•„ν‚€ν…μ²˜ μ˜μ‘΄μ„±μ΄ κ°•ν•œ 뢀뢄듀이 μ§μ ‘μ μœΌλ‘œ 영ν–₯을 λ°›λŠ”λ‹€.

특히 μ‹œμŠ€ν…œ 콜과 μ˜ˆμ™Έ 처리, μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ˜ 같은 λ™μž‘μ€ 각 μ•„ν‚€ν…μ²˜μ˜ λͺ…λ Ήμ–΄ μ§‘ν•©μ΄λ‚˜ λ ˆμ§€μŠ€ν„°

ꡬ쑰에 따라 κ΅¬ν˜„ 방식이 크게 달라진닀.

μ•„ν‚€ν…μ²˜λ³„ μ‹œμŠ€ν…œ 콜 흐름과 컀널 λ³€κ²½ μ»΄ν¬λ„ŒνŠΈ

μ•„ν‚€ν…μ²˜κ°€ λ°”λ€Œλ©΄ μ»€λ„μ˜ ꡬ쑰와 λ™μž‘ 흐름에 영ν–₯을 λ―ΈμΉ˜λŠ” μ£Όμš” μ»΄ν¬λ„ŒνŠΈκ°€ 달라진닀.

특히 μ‹œμŠ€ν…œ 콜 호좜 방식, μ˜ˆμ™Έ 처리, μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ˜, μ΄ˆκΈ°ν™” 루틴, λ””λ°”μ΄μŠ€ 트리 적용 방식은

μ•„ν‚€ν…μ²˜λ³„λ‘œ κ΅¬ν˜„ 방식이 μ „ν˜€ λ‹€λ₯΄λ‹€. ν‘œλ‘œ μž‘μ„±ν•˜λ©΄ μ•„λž˜μ™€ κ°™λ‹€.

ComponentDescriptionx86 (32-bit)x86_64 (AMD64)ARMv7 (AArch32)ARMv8 (AArch64)
System Call Handling방식 및 호좜 κ·œμ•½Uses int 0x80 instructionSyscall number in EAX, args in EBX~Uses syscall instructionNumber in RAX, args in RDI, RSI, RDX, R10, R8, R9Uses svc #0Number in r7, args in r0~r6Uses svc #0Number in x8, args in x0~x5
Exception / Interrupt Handling트랩 벑터와 μ˜ˆμ™Έ μ§„μž…IDT (Interrupt Descriptor Table), gate type μ„€μ •MSRs (Model Specific Registers) μ‚¬μš©, SYSCALL/SYSRET 트랩 처리Vector table, 각 λͺ¨λ“œλ³„ λ ˆμ§€μŠ€ν„° 뱅크 쑴재Exception levels (EL0~EL3), SPSR/ELR λ ˆμ§€μŠ€ν„°λ‘œ μƒνƒœ μ €μž₯
Context Switchλ ˆμ§€μŠ€ν„° μ €μž₯ 및 볡원EAX~EDI, EIP, ESP, EFLAGS λ“± μ €μž₯RAX~R15, RIP, RSP, RFLAGS λ“± μ €μž₯r0~r12, SP, LR, CPSR λ“±, ν•„μš” μ‹œ FPU μƒνƒœ 포함x0~x30, SP, SPSR_EL1, ELR_EL1 λ“±, SIMD μƒνƒœ 포함
Boot and Initialization CodeνŽ˜μ΄μ§•, MMU, μΊμ‹œ μ„€μ •CR0, CR3, GDT, IDT μ„€μ • ν›„ νŽ˜μ΄μ§• μ‹œμž‘Long mode μ§„μž…, IA32_EFER, PML4 μ„ΈνŒ…MMU 켜기 μœ„ν•΄ page table, TTBR μ„€μ •Translation table 생성, TTBR0_EL1, MAIR_EL1 λ“± μ‹œμŠ€ν…œ λ ˆμ§€μŠ€ν„° ꡬ성
Device Tree & Driver Bindingν”Œλž«νΌ μ΄ˆκΈ°ν™”μ™€ μ—°κ²° μ •λ³΄μΌλ°˜μ μœΌλ‘œ ACPI λ˜λŠ” BIOS 정보 기반ACPI 기반으둜 λ””λ°”μ΄μŠ€ λ¦¬μ†ŒμŠ€ νŒŒμ•…Flattened Device Tree (FDT) 방식 μ‚¬μš©λ³΄λ“œλ³„ DTS 파일 ν•„μš”Device Tree μ‚¬μš© 방식은 λ™μΌν•˜λ‚˜ 64λΉ„νŠΈμš© λ“œλΌμ΄λ²„ ꡬ성 ν•„μš”

μœ„ λ‚΄μš© 처럼 μ•„ν‚€ν…μ²˜λ³„λ‘œ 컀널 λ™μž‘ 흐름이 λ°”λ€ŒλŠ” μ΄μœ λŠ” 각 CPU μ•„ν‚€ν…μ²˜κ°€ μ„œλ‘œ λ‹€λ₯Έ ν•˜λ“œμ›¨μ–΄ ꡬ쑰와 λͺ…λ Ήμ–΄ μ§‘ν•©(ISA: Instruction Set Architecture)을 κ°€μ§€κ³  있기 λ•Œλ¬Έμ΄λ‹€.

컀널은 ν•˜λ“œμ›¨μ–΄μ™€ 직접 λ§žλ‹Ώμ•„ μžˆλŠ” μ†Œν”„νŠΈμ›¨μ–΄μ΄κΈ° λ•Œλ¬Έμ—, μ•„λž˜μ™€ 같은 μš”μ†Œλ“€μ΄ 달라지면 μ»€λ„μ˜ λ™μž‘ 방식도 ꡬ쑰적으둜 λ‹¬λΌμ§ˆ μˆ˜λ°–μ— μ—†λ‹€.

λ˜ν•œ κΌ­ ISA 의 차이 말고도 λ ˆμ§€μŠ€ν„°λ‚˜ λΆ€νŠΈ μ΄ˆκΈ°ν™” 방식에 λ”°λΌμ„œλ„ 차이가 λ‚˜νƒ€λ‚  수 있으며 보닀 μƒμ„Έν•œ μ„€λͺ…은 ν‘œλ‘œ λŒ€μ²΄ν•œλ‹€.

** 컀널 λ™μž‘ 흐름이 μ•„ν‚€ν…μ²˜λ³„λ‘œ λ°”λ€ŒλŠ” 이유

ꡬ뢄섀λͺ…
λͺ…λ Ήμ–΄ μ§‘ν•©(ISA)각 μ•„ν‚€ν…μ²˜λŠ” μ„œλ‘œ λ‹€λ₯Έ λͺ…λ Ήμ–΄ 집합을 κ°€μ§„λ‹€. 예λ₯Ό λ“€μ–΄ x86은 int 0x80, ARM은 svc #0을 μ‚¬μš©ν•˜μ—¬ μ‹œμŠ€ν…œ μ½œμ„ ν˜ΈμΆœν•œλ‹€. 컀널은 이 λͺ…령어에 맞좰 μ§„μž… 루틴을 κ΅¬ν˜„ν•΄μ•Ό ν•œλ‹€.
λ ˆμ§€μŠ€ν„° ꡬ쑰인자 전달, λ°˜ν™˜κ°’ μ €μž₯, μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ˜ 등은 λ ˆμ§€μŠ€ν„°λ₯Ό 톡해 이루어진닀. μ•„ν‚€ν…μ²˜λ§ˆλ‹€ λ ˆμ§€μŠ€ν„° μˆ˜μ™€ λͺ…μΉ­, μš©λ„κ°€ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μ»€λ„μ˜ μ‹œμŠ€ν…œ 콜 처리, μŠ€μΌ€μ€„λŸ¬, μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬ μ½”λ“œκ°€ 달라진닀.
μ˜ˆμ™Έ/μΈν„°λŸ½νŠΈ 처리 ꡬ쑰트랩 벑터 ν…Œμ΄λΈ”μ˜ μœ„μΉ˜μ™€ ꡬ쑰, λͺ¨λ“œ μ „ν™˜ 방식이 μ•„ν‚€ν…μ²˜λ§ˆλ‹€ λ‹€λ₯΄λ‹€. ARM은 Exception Level(EL) ꡬ쑰λ₯Ό κ°€μ§€κ³  있고, x86은 IDT와 privilege level κΈ°λ°˜μ΄λ‹€.
MMU 및 νŽ˜μ΄μ§• ꡬ쑰메λͺ¨λ¦¬ λ³΄ν˜Έμ™€ 가상 μ£Όμ†Œ λ³€ν™˜μ— μ‚¬μš©ν•˜λŠ” νŽ˜μ΄μ§€ ν…Œμ΄λΈ” ν˜•μ‹μ΄ μ•„ν‚€ν…μ²˜λ§ˆλ‹€ λ‹€λ₯΄λ‹€. λ”°λΌμ„œ μ΄ˆκΈ°ν™” μ½”λ“œμ™€ νŽ˜μ΄μ§€ ν…Œμ΄λΈ” 생성 μ½”λ“œλ„ 각각 λ‹€λ₯΄κ²Œ κ΅¬ν˜„λœλ‹€.
λΆ€νŠΈ 및 μ΄ˆκΈ°ν™” λ°©μ‹λΆ€νŠΈλ‘œλ”μ™€ μ»€λ„μ˜ μ΄ˆκΈ°ν™” μ§„μž… 방식 λ˜ν•œ μ•„ν‚€ν…μ²˜λ³„λ‘œ 차이가 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ x86은 BIOS λ˜λŠ” UEFIλ₯Ό 톡해 μ§„μž…ν•˜κ³ , ARM은 U-Bootκ³Ό DTB(Device Tree Blob)λ₯Ό μ‚¬μš©ν•œλ‹€.
ν•˜λ“œμ›¨μ–΄ μΈν„°νŽ˜μ΄μŠ€ ν‘œμ€€x86은 ACPI 기반으둜 λ””λ°”μ΄μŠ€λ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” 반면, ARM은 Device Treeλ₯Ό 톡해 ν•˜λ“œμ›¨μ–΄ 정보λ₯Ό μ „λ‹¬ν•œλ‹€. 이에 따라 ν”Œλž«νΌ λ“œλΌμ΄λ²„ μ΄ˆκΈ°ν™” μ½”λ“œκ°€ λ‹€λ₯΄λ‹€.

μ •λ¦¬ν•˜μžλ©΄ 컀널은 λ‹¨μˆœν•œ ν”„λ‘œκ·Έλž¨μ΄ μ•„λ‹ˆλΌ, ν•˜λ“œμ›¨μ–΄λ₯Ό μ œμ–΄ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄λ©°,

이에 따라 CPUκ°€ μ‚¬μš©ν•˜λŠ” λͺ…λ Ήμ–΄, λ ˆμ§€μŠ€ν„°, μΈν„°λŸ½νŠΈ 처리 방식, λ©”λͺ¨λ¦¬ μ ‘κ·Ό ꡬ쑰가 λ°”λ€Œλ©΄, 이λ₯Ό μ „μ œλ‘œ λ§Œλ“€μ–΄μ§„ 컀널 μ½”λ“œλ„ μ•„ν‚€ν…μ²˜μ— 맞게 μ„€κ³„λ˜μ–΄μ•Ό ν•œλ‹€.

κ·Έλž˜μ„œ μ»€λ„μ—λŠ” 항상 arch/ 디렉터리 μ•„λž˜μ— μ•„ν‚€ν…μ²˜λ³„ κ΅¬ν˜„ μ½”λ“œκ°€ λ”°λ‘œ μ‘΄μž¬ν•œλ‹€.

μ΄λŠ” λ‹¨μˆœνžˆ λ¬Έλ²•μ΄λ‚˜ ν‘œκΈ° 방식이 λ‹¬λΌμ§€λŠ” 것이 μ•„λ‹ˆλΌ, λ™μž‘μ˜ κΈ°λ³Έ 원칙과 흐름이 ν•˜λ“œμ›¨μ–΄ ꡬ쑰에 맞게 μ„€κ³„λ˜μ–΄μ•Ό ν•œλ‹€λŠ” 것을 μ˜λ―Έν•œλ‹€.

μ•„ν‚€ν…μ²˜λ³„ μ‹œμŠ€ν…œ 콜 흐름 비ꡐ

(System Call Flow Comparison by Architecture)

μ•„ν‚€ν…μ²˜λ³„ μ‹œμŠ€ν…œ 콜 흐름 비ꡐλ₯Ό μœ„ν•΄ 각 μ•„ν‚€ν…μ²˜κ°€ μ‹œμŠ€ν…œ μ½œμ„ μ²˜λ¦¬ν•˜λŠ” 방식, λͺ…λ Ήμ–΄,

λ ˆμ§€μŠ€ν„° 전달 κ·œμ•½, μ§„μž… μ‹œ 레벨 λ³€ν™” 등을 μ •λ¦¬ν•œ ν‘œλ‘œ 컀널 ν¬νŒ…μ΄λ‚˜

μ•„ν‚€ν…μ²˜λ³„ syscall handler κ΅¬ν˜„ μ‹œ μ°Έκ³ ν•˜κΈ° μœ„ν•΄ μ •λ¦¬ν•˜μ˜€λ‹€.

ν•­λͺ©x86 (IA-32)x86_64 (AMD64)ARMv7 (AArch32)ARMv8 (AArch64)
호좜 λͺ…λ Ήμ–΄int 0x80syscallsvc #0svc #0
μ§„μž… λ°©μ‹μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈ(INT instruction)Fast syscall path(SYSCALL MSR + STAR)Supervisor Call 벑터Exception Level μ „ν™˜ (EL0 β†’ EL1)
μ‹œμŠ€ν…œ 콜 번호EAXRAXr7x8
인자 전달EBX, ECX, EDX, ESI, EDI, EBPRDI, RSI, RDX, R10, R8, R9r0 ~ r6x0 ~ x5
λ°˜ν™˜κ°’EAXRAXr0x0
컀널 μ§„μž…μ IDT (Interrupt Descriptor Table)MSRs + syscall handler (do_syscall_64)Vector table base + SVC handlerVBAR_EL1 벑터 ν…Œμ΄λΈ” + EL1 ν•Έλ“€λŸ¬
볡귀 λͺ…λ Ήμ–΄iretsysretmovs pc, lr (λ˜λŠ” subs pc, lr, #4)eret
λͺ¨λ“œ μ „ν™˜μ‚¬μš©μž λͺ¨λ“œ β†’ 컀널 λͺ¨λ“œRing 3 β†’ Ring 0μ‚¬μš©μž λͺ¨λ“œ β†’ SVC λͺ¨λ“œEL0 β†’ EL1
λ³΄μ•ˆ/κΆŒν•œ 보호Ring level 기반 (Ring 3 β†’ 0)동일 (Ring 기반)CPSR λͺ¨λ“œ ν”Œλž˜κ·ΈSPSR_EL1 + ELR_EL1 μ‘°ν•©μœΌλ‘œ μ œμ–΄

ν‘œμ—μ„œ λ‚˜νƒ€λ‚œ μ£Όμš” 차이점에 λŒ€ν•΄ κ°„λ‹¨νžˆ μ„€λͺ…ν•˜μžλ©΄

x86: 전톡적인 방식인 int 0x80 μ‚¬μš©, λŠλ¦¬μ§€λ§Œ λ‹¨μˆœν•¨.

x86_64: syscall λͺ…λ ΉμœΌλ‘œ λΉ λ₯Έ μ§„μž…. syscall λ²ˆν˜ΈλŠ” RAX, μΈμžλŠ” μ΅œλŒ€ 6개 κ³ μ • λ ˆμ§€μŠ€ν„°.

ARMv7: svc #0을 톡해 μ§„μž…, syscall λ²ˆν˜ΈλŠ” r7 λ ˆμ§€μŠ€ν„°μ—, μΈμžλŠ” r0λΆ€ν„° 전달.

ARMv8: ARMv7κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ 64λΉ„νŠΈ μ „μš© ꡬ쑰. EL0μ—μ„œ EL1둜 μ˜ˆμ™Έ μ „ν™˜λ˜λ©° x8에 syscall 번호 전달.

ARMv8은 ARMv7κ³Ό λͺ…λ Ήμ–΄λŠ” κ°™μ§€λ§Œ κ΅¬μ‘°λŠ” 훨씬 μ •κ΅ν•˜λ‹€. μœ μ € λͺ¨λ“œμΈ EL0μ—μ„œ 컀널 λͺ¨λ“œμΈ EL1둜 μ „ν™˜λ˜λ©°, syscall λ²ˆν˜ΈλŠ” x8, μΈμžλŠ” x0λΆ€ν„° x5κΉŒμ§€ μ‚¬μš©λœλ‹€. 컀널은 VBAR_EL1에 μ§€μ •λœ 벑터 ν…Œμ΄λΈ”μ„ 톡해 μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜κ³ , λ³΅κ·€λŠ” eret λͺ…λ ΉμœΌλ‘œ μˆ˜ν–‰λœλ‹€.

컀널 개발 ν”„λ‘œμ νŠΈμ— μ•žμ„œ ν•„μžλŠ” “ARMv8” μ•„ν‚€ν…μ²˜λ₯Ό μ‚¬μš©ν•  것이며

μ•žμœΌλ‘œ μž‘μ„±λ˜λŠ” 글에 λŒ€ν•΄μ„œλŠ” ν•΄λ‹Ή μ•„ν‚€ν…μ²˜λ₯Ό κΈ°μ€€μœΌλ‘œ μž‘μ„±ν•  μ˜ˆμ •μ΄λ‹€.