
Linux Kernel β 3 System Call Flows and Kernel Component Differences by Architectureπ§
μν€ν μ²κ° λ¬λΌμ§λ©΄ 컀λ λ΄λΆμμ μν€ν μ² μμ‘΄μ±μ΄ κ°ν λΆλΆλ€μ΄ μ§μ μ μΌλ‘ μν₯μ λ°λλ€.
νΉν μμ€ν  μ½κ³Ό μμΈ μ²λ¦¬, 컨ν μ€νΈ μ€μμΉ κ°μ λμμ κ° μν€ν μ²μ λͺ λ Ήμ΄ μ§ν©μ΄λ λ μ§μ€ν°
ꡬ쑰μ λ°λΌ ꡬν λ°©μμ΄ ν¬κ² λ¬λΌμ§λ€.
μν€ν μ²λ³ μμ€ν  μ½ νλ¦κ³Ό 컀λ λ³κ²½ μ»΄ν¬λνΈ
μν€ν μ²κ° λ°λλ©΄ 컀λμ ꡬ쑰μ λμ νλ¦μ μν₯μ λ―ΈμΉλ μ£Όμ μ»΄ν¬λνΈκ° λ¬λΌμ§λ€.
νΉν μμ€ν  μ½ νΈμΆ λ°©μ, μμΈ μ²λ¦¬, 컨ν μ€νΈ μ€μμΉ, μ΄κΈ°ν 루ν΄, λλ°μ΄μ€ νΈλ¦¬ μ μ© λ°©μμ
μν€ν μ²λ³λ‘ ꡬν λ°©μμ΄ μ ν λ€λ₯΄λ€. νλ‘ μμ±νλ©΄ μλμ κ°λ€.
| Component | Description | x86 (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, R9 | Uses svc #0Number in r7, args in r0~r6 | Uses 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 0x80 | syscall | svc #0 | svc #0 | 
| μ§μ λ°©μ | μννΈμ¨μ΄ μΈν°λ½νΈ(INT instruction) | Fast syscall path(SYSCALL MSR + STAR) | Supervisor Call λ²‘ν° | Exception Level μ ν (EL0 β EL1) | 
| μμ€ν  μ½ λ²νΈ | EAX | RAX | r7 | x8 | 
| μΈμ μ λ¬ | EBX, ECX, EDX, ESI, EDI, EBP | RDI, RSI, RDX, R10, R8, R9 | r0 ~ r6 | x0 ~ x5 | 
| λ°νκ° | EAX | RAX | r0 | x0 | 
| 컀λ μ§μ μ  | IDT (Interrupt Descriptor Table) | MSRs + syscall handler (do_syscall_64) | Vector table base + SVC handler | VBAR_EL1 λ²‘ν° ν μ΄λΈ + EL1 νΈλ€λ¬ | 
| λ³΅κ· λͺ λ Ήμ΄ | iret | sysret | movs 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” μν€ν μ²λ₯Ό μ¬μ©ν κ²μ΄λ©°
μμΌλ‘ μμ±λλ κΈμ λν΄μλ ν΄λΉ μν€ν μ²λ₯Ό κΈ°μ€μΌλ‘ μμ±ν μμ μ΄λ€.